A bit of context
In this exercise, we will see how to make a color plot of \(4\pi r^2\times G(r,t)\) data obtained from Molecular Dynamics simulations. These files can be downloaded here. These auto-correlators \(G(r,t)\) are obtained from MD trajectories of a fluid encapsulated in a porous medium by computing the probability that each molecule moves by a distance \(r\) over a time \(t\). The MD trajectories are performed with LAMMPS and the trajectories treated by a home-made C program producing these files.
In these simulations, we varied the depth of the interaction well. It is given in the name of the file such as Grt_xx.dat
, where xx = 0.01, 0.1, 0.2, 0.3, 0.5, 0.8, 1 corresponds to \(\varepsilon/k_BT\). \(\varepsilon/k_BT\) is the depth of the interaction well in units of temperature.
The Grt_xx.dat
files contain the \(4\pi r^2\times G(r,t)\) data under the form of a matrix, with \(r\) increasing with the rows and \(t\) with the columns. \(r\) goes from 0 to 20 Å and \(t\) goes from 0 to 200 ps.
Plotting data
We should have a Grt
dataset that looks like this:
## # A tibble: 2,815,407 x 4
## r.A t.ps r2Grt epskt
## <dbl> <dbl> <dbl> <dbl>
## 1 0 0 77.7 0.01
## 2 0 0.1 0.000512 0.01
## 3 0 0.2 0.000203 0.01
## 4 0 0.3 0.000148 0.01
## 5 0 0.4 0.0000979 0.01
## 6 0 0.5 0.0000817 0.01
## 7 0 0.6 0.0000714 0.01
## 8 0 0.7 0.0000683 0.01
## 9 0 0.8 0.0000687 0.01
## 10 0 0.9 0.0000552 0.01
## # … with 2,815,397 more rows
We will now plot this as a colored heatmap using geom_raster
from ggplot2
:
- We will first plot
Grt
only for times below 100 ps and \(\varepsilon/k_BT=0.5\), so recursively filter the data accordingly, then provide this to ggplot
- Use a nicer axis labels
- Do you see anything on the plot?
- In fact, we need to saturate values above a certain limit in order to see the fine evolution of the \(G(r,t)\) auto-correlator. Add a mutation of the tibble attributing the limit value to all points above this limit, and play with the limit value in order to have a nicer plot.
- Add a vertical dashed line in x=8.18Å marking the mean pore size for this structure.
- Use a nicer color scheme with more colors in order to better see the variations.
lim <- 0.1
nbreak <- 6
colors <- colorRampPalette(c("white","royalblue","seagreen","orange","red","brown"))(50)
Grt %>%
filter(t.ps<=100, epskt==0.5) %>%
mutate(r2Grt=ifelse(r2Grt>lim, lim, r2Grt)) %>%
ggplot(aes(x=r.A, y=t.ps, fill=r2Grt))+
geom_raster()+
geom_vline(aes(xintercept=8.18), lty=2)+
scale_fill_gradientn(
colors = colors,
name = '',
breaks = seq(0, lim, length=nbreak),
labels = c(seq(0, lim, length=nbreak)[1:(nbreak-1)], paste(">",lim))
) +
labs(x = "r [Å]", y="Time [ps]") +
scale_x_continuous(expand = c(0,0)) +
scale_y_continuous(expand = c(0,0))
Now we want to see the evolution of \(G(r,t)\) as a function of \(\varepsilon/k_BT\). Using the procedure above, plot \(G(r,t)\) for all \(\varepsilon/k_BT\) on a grid.
lim <- 0.1
nbreak <- 6
colors <- colorRampPalette(c("white","royalblue","seagreen","orange","red","brown"))(50)
Grt %>%
filter(t.ps<=100) %>%
mutate(r2Grt=ifelse(r2Grt>lim, lim, r2Grt)) %>%
ggplot(aes(x=r.A, y=t.ps, fill=r2Grt))+
geom_raster()+
geom_vline(aes(xintercept=8.18), lty=2)+
scale_fill_gradientn(
colors = colors,
name = '',
breaks = seq(0, lim, length=nbreak),
labels = c(seq(0, lim, length=nbreak)[1:(nbreak-1)], paste(">",lim))
) +
labs(x = "r [Å]", y="Time [ps]") +
scale_x_continuous(expand = c(0,0)) +
scale_y_continuous(expand = c(0,0)) +
facet_wrap(~epskt)
LS0tCnRpdGxlIDogIlIgRXhlcmNpc2VzIC0gRyhyLHQpIgpkYXRlICA6ICIyMDIwLTA3LTA3IgpvdXRwdXQ6IAogICAgaHRtbF9kb2N1bWVudDoKICAgICAgICB0b2MgICAgICAgICAgICA6IHRydWUKICAgICAgICB0b2NfZmxvYXQgICAgICA6IHRydWUKICAgICAgICB0b2NfZGVwdGggICAgICA6IDQKICAgICAgICBoaWdobGlnaHQgICAgICA6IHRhbmdvCiAgICAgICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICAgICAgY29kZV9kb3dubG9hZCAgOiB0cnVlCnBhcmFtczogCiAgICBzb2x1dGlvbjoKICAgICAgICB2YWx1ZTogdHJ1ZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGNhY2hlPUZBTFNFfQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbXlfdGhlbWUgPC0gdGhlbWVfYncoKSsKICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCxjb2xvdXI9ImJsYWNrIiksCiAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSwKICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LGNvbG91cj0iYmxhY2siKSwKICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCxjb2xvdXI9ImJsYWNrIiksCiAgICAgICAgICAgICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEpLAogICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KDEsImNtIiksCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gImNlbnRlciIsCiAgICAgICAgICAgICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgIHN0cmlwLnRleHQ9ZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZT0wKSwKICAgICAgICAgICAgICAgICAgcGFuZWwuc3BhY2luZyA9IHVuaXQoMSwgImxpbmVzIikKICAgICAgICAgICAgICAgICAgKQp0aGVtZV9zZXQobXlfdGhlbWUpCmBgYAoKIyBBIGJpdCBvZiBjb250ZXh0CgpJbiB0aGlzIGV4ZXJjaXNlLCB3ZSB3aWxsIHNlZSBob3cgdG8gbWFrZSBhIGNvbG9yIHBsb3Qgb2YgJDRccGkgcl4yXHRpbWVzIEcocix0KSQgZGF0YSBvYnRhaW5lZCBmcm9tIE1vbGVjdWxhciBEeW5hbWljcyBzaW11bGF0aW9ucy4KVGhlc2UgZmlsZXMgY2FuIGJlIGRvd25sb2FkZWQgPGEgaHJlZj0iRGF0YS9HcnQuemlwIiBkb3dubG9hZCB0YXJnZXQ9Il9ibGFuayI+aGVyZTwvYT4uClRoZXNlIGF1dG8tY29ycmVsYXRvcnMgJEcocix0KSQgYXJlIG9idGFpbmVkIGZyb20gTUQgdHJhamVjdG9yaWVzIG9mIGEgZmx1aWQgZW5jYXBzdWxhdGVkIGluIGEgcG9yb3VzIG1lZGl1bSBieSBjb21wdXRpbmcgdGhlIHByb2JhYmlsaXR5IHRoYXQgZWFjaCBtb2xlY3VsZSBtb3ZlcyBieSBhIGRpc3RhbmNlICRyJCBvdmVyIGEgdGltZSAkdCQuIFRoZSBNRCB0cmFqZWN0b3JpZXMgYXJlIHBlcmZvcm1lZCB3aXRoIFtMQU1NUFNdKGh0dHBzOi8vbGFtbXBzLnNhbmRpYS5nb3YvKSBhbmQgdGhlIHRyYWplY3RvcmllcyB0cmVhdGVkIGJ5IGEgaG9tZS1tYWRlIEMgcHJvZ3JhbSBwcm9kdWNpbmcgdGhlc2UgZmlsZXMuCgpJbiB0aGVzZSBzaW11bGF0aW9ucywgd2UgdmFyaWVkIHRoZSBkZXB0aCBvZiB0aGUgaW50ZXJhY3Rpb24gd2VsbC4gSXQgaXMgZ2l2ZW4gaW4gdGhlIG5hbWUgb2YgdGhlIGZpbGUgc3VjaCBhcyBgR3J0X3h4LmRhdGAsIHdoZXJlIHh4ID0gMC4wMSwgMC4xLCAwLjIsIDAuMywgMC41LCAwLjgsIDEgY29ycmVzcG9uZHMgdG8gJFx2YXJlcHNpbG9uL2tfQlQkLiAkXHZhcmVwc2lsb24va19CVCQgaXMgdGhlIGRlcHRoIG9mIHRoZSBpbnRlcmFjdGlvbiB3ZWxsIGluIHVuaXRzIG9mIHRlbXBlcmF0dXJlLgoKVGhlIGBHcnRfeHguZGF0YCBmaWxlcyBjb250YWluIHRoZSAkNFxwaSByXjJcdGltZXMgRyhyLHQpJCBkYXRhIHVuZGVyIHRoZSBmb3JtIG9mIGEgbWF0cml4LCB3aXRoICRyJCBpbmNyZWFzaW5nIHdpdGggdGhlIHJvd3MgYW5kICR0JCB3aXRoIHRoZSBjb2x1bW5zLiAkciQgZ29lcyBmcm9tIDAgdG8gMjAgw4UgYW5kICR0JCBnb2VzIGZyb20gMCB0byAyMDAgcHMuCgojIFJlYWRpbmcgYW5kIHRpZHlpbmcgdGhlIGRhdGEKCldlIHdhbnQgdG8gcmVhZCBhbGwgZGF0YSBmaWxlcyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgdGlkeSB0aWJibGUgZm9yIGVhc2Ugb2YgcGxvdHRpbmcuCgotIExvYWQgdGhlIGB0aWR5dmVyc2VgIGFuZCBgZ2dwbG90MmAgcGFja2FnZXMKLSBGaW5kIGFsbCBmaWxlcyBzdGFydGluZyBieSAiR3J0IiBhbmQgc3RvcmUgdGhlbSBpbiBhIHZlY3RvciBgR3J0X2ZpbGVzYAotIEluaXRpYXRlIGFuIGVtcHR5IHRpYmJsZSBgR3J0YCB0aGF0IHdpbGwgc3RvcmUgYWxsIGRhdGEKLSBVc2luZyBhIGBmb3JgIGxvb3A6CiAgICAtIHJlYWQgdGhlIGZpbGVzCiAgICAtIGFkZCBjb2x1bW5zIG5hbWVzIGFzIHRoZSB0aW1lcyB2YWx1ZXMKICAgIC0gYWRkIHRoZSBgci5BYCBjb2x1bW4gY29udGFpbmluZyB0aGUgciB2YWx1ZXMKICAgIC0gYW5kIHJlY3Vyc2l2ZWx5ICh1c2luZyB0aGUgcGlwZSBgJT4lYCkgCiAgICAgICAgLSBwaXZvdCB0aGUgdGFibGUgdG8gbWFrZSBpdCB0aWR5LCB3aXRoIHRoZSBjb2x1bW5zIGByLkFgLCBgdC5wc2AgYW5kIGByMkdydGAKICAgICAgICAtIG1ha2Ugc3VyZSB0aGF0IHRoZSB0aW1lcyBhcmUgcmVhZCBhcyBudW1lcmljIHZhbHVlcwogICAgICAgIC0gYWRkIHRoZSBgZXBza3RgIGNvbHVtbiBjb250YWluaW5nIHRoZSAkXHZhcmVwc2lsb24va19CVCQgdmFsdWUKICAgIC0gc3RvcmUgdGhpcyBpbiBgR3J0YAoKCmBgYHtyIGluY2x1ZGU9cGFyYW1zJHNvbHV0aW9uLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGNhY2hlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3Bsb3QyKQpHcnRfZmlsZXMgPC0gbGlzdC5maWxlcyhwYXR0ZXJuID0gIkdydF8iLCBwYXRoPSJEYXRhIikKR3J0ICAgICAgIDwtIHRpYmJsZSgpCmZvcihHcnRfZmlsZSBpbiBHcnRfZmlsZXMpeyNHcnRfZmlsZSA8LSBHcnRfZmlsZXNbMV0KICAgIGQgPC0gcmVhZF90YWJsZTIoZmlsZS5wYXRoKCJEYXRhIixHcnRfZmlsZSksIGNvbF9uYW1lcz1GQUxTRSkKICAgIG5hbWVzKGQpIDwtIGFzLmNoYXJhY3RlcihzZXEoMCwyMDAsIGxlbmd0aD1uY29sKGQpKSkKICAgIGQkci5BICAgIDwtIHNlcSgwLDIwLCBsZW5ndGg9bnJvdyhkKSkKICAgIGVwcyA8LSBnc3ViKCIuZGF0IiwiIixnc3ViKCJHcnRfIiwiIixHcnRfZmlsZSkpCiAgICBkIDwtIGQgJT4lIAogICAgICAgIHBpdm90X2xvbmdlcihjb2xzPS1yLkEsCiAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvPSJ0LnBzIiwKICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdHJhbnNmb3JtPWxpc3QodC5wcyA9IGFzLm51bWVyaWMpLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG89InIyR3J0IikgJT4lIAogICAgICAgIG11dGF0ZShlcHNrdD1hcy5udW1lcmljKGVwcykpCiAgICBHcnQgPC0gYmluZF9yb3dzKEdydCwgZCkKfQpgYGAKCiMgUGxvdHRpbmcgZGF0YQoKV2Ugc2hvdWxkIGhhdmUgYSBgR3J0YCBkYXRhc2V0IHRoYXQgbG9va3MgbGlrZSB0aGlzOgoKYGBge3IgaW5jbHVkZT1UUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGNhY2hlPUZBTFNFfQpHcnQKYGBgCgpXZSB3aWxsIG5vdyBwbG90IHRoaXMgYXMgYSBjb2xvcmVkIGhlYXRtYXAgdXNpbmcgYGdlb21fcmFzdGVyYCBmcm9tIGBnZ3Bsb3QyYDoKCi0gV2Ugd2lsbCBmaXJzdCBwbG90IGBHcnRgIG9ubHkgZm9yIHRpbWVzIGJlbG93IDEwMCBwcyBhbmQgJFx2YXJlcHNpbG9uL2tfQlQ9MC41JCwgc28gcmVjdXJzaXZlbHkgZmlsdGVyIHRoZSBkYXRhIGFjY29yZGluZ2x5LCB0aGVuIHByb3ZpZGUgdGhpcyB0byBgZ2dwbG90YAorIFVzZSBhIG5pY2VyIGF4aXMgbGFiZWxzCisgRG8geW91IHNlZSBhbnl0aGluZyBvbiB0aGUgcGxvdD8KKyBJbiBmYWN0LCB3ZSBuZWVkIHRvIHNhdHVyYXRlIHZhbHVlcyBhYm92ZSBhIGNlcnRhaW4gbGltaXQgaW4gb3JkZXIgdG8gc2VlIHRoZSBmaW5lIGV2b2x1dGlvbiBvZiB0aGUgJEcocix0KSQgYXV0by1jb3JyZWxhdG9yLiBBZGQgYSBtdXRhdGlvbiBvZiB0aGUgdGliYmxlIGF0dHJpYnV0aW5nIHRoZSBsaW1pdCB2YWx1ZSB0byBhbGwgcG9pbnRzIGFib3ZlIHRoaXMgbGltaXQsIGFuZCBwbGF5IHdpdGggdGhlIGxpbWl0IHZhbHVlIGluIG9yZGVyIHRvIGhhdmUgYSBuaWNlciBwbG90LgotIEFkZCBhIHZlcnRpY2FsIGRhc2hlZCBsaW5lIGluIHg9OC4xOMOFIG1hcmtpbmcgdGhlIG1lYW4gcG9yZSBzaXplIGZvciB0aGlzIHN0cnVjdHVyZS4KLSBVc2UgYSBuaWNlciBjb2xvciBzY2hlbWUgd2l0aCBtb3JlIGNvbG9ycyBpbiBvcmRlciB0byBiZXR0ZXIgc2VlIHRoZSB2YXJpYXRpb25zLgoKYGBge3IgaW5jbHVkZT1wYXJhbXMkc29sdXRpb24sIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgY2FjaGU9RkFMU0V9CmxpbSAgICA8LSAwLjEKbmJyZWFrIDwtIDYKY29sb3JzIDwtIGNvbG9yUmFtcFBhbGV0dGUoYygid2hpdGUiLCJyb3lhbGJsdWUiLCJzZWFncmVlbiIsIm9yYW5nZSIsInJlZCIsImJyb3duIikpKDUwKQpHcnQgJT4lIAogICAgZmlsdGVyKHQucHM8PTEwMCwgZXBza3Q9PTAuNSkgJT4lIAogICAgbXV0YXRlKHIyR3J0PWlmZWxzZShyMkdydD5saW0sIGxpbSwgcjJHcnQpKSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHg9ci5BLCB5PXQucHMsIGZpbGw9cjJHcnQpKSsKICAgICAgICBnZW9tX3Jhc3RlcigpKwogICAgICAgIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9OC4xOCksIGx0eT0yKSsKICAgICAgICBzY2FsZV9maWxsX2dyYWRpZW50bigKICAgICAgICAgICAgY29sb3JzID0gY29sb3JzLCAKICAgICAgICAgICAgbmFtZSAgID0gJycsCiAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgwLCBsaW0sIGxlbmd0aD1uYnJlYWspLCAKICAgICAgICAgICAgbGFiZWxzID0gYyhzZXEoMCwgbGltLCBsZW5ndGg9bmJyZWFrKVsxOihuYnJlYWstMSldLCBwYXN0ZSgiPiIsbGltKSkgCiAgICAgICAgKSArCiAgICAgICAgbGFicyh4ID0gInIgW8OFXSIsIHk9IlRpbWUgW3BzXSIpICsKICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKSArIAogICAgICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpCmBgYAoKCk5vdyB3ZSB3YW50IHRvIHNlZSB0aGUgZXZvbHV0aW9uIG9mICRHKHIsdCkkIGFzIGEgZnVuY3Rpb24gb2YgJFx2YXJlcHNpbG9uL2tfQlQkLiBVc2luZyB0aGUgcHJvY2VkdXJlIGFib3ZlLCBwbG90ICRHKHIsdCkkIGZvciBhbGwgCiRcdmFyZXBzaWxvbi9rX0JUJCBvbiBhIGdyaWQuCgpgYGB7ciBpbmNsdWRlPXBhcmFtcyRzb2x1dGlvbiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCBjYWNoZT1GQUxTRX0KbGltICAgIDwtIDAuMQpuYnJlYWsgPC0gNgpjb2xvcnMgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCJ3aGl0ZSIsInJveWFsYmx1ZSIsInNlYWdyZWVuIiwib3JhbmdlIiwicmVkIiwiYnJvd24iKSkoNTApCkdydCAlPiUgCiAgICBmaWx0ZXIodC5wczw9MTAwKSAlPiUgCiAgICBtdXRhdGUocjJHcnQ9aWZlbHNlKHIyR3J0PmxpbSwgbGltLCByMkdydCkpICU+JSAKICAgIGdncGxvdChhZXMoeD1yLkEsIHk9dC5wcywgZmlsbD1yMkdydCkpKwogICAgICAgIGdlb21fcmFzdGVyKCkrCiAgICAgICAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD04LjE4KSwgbHR5PTIpKwogICAgICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKAogICAgICAgICAgICBjb2xvcnMgPSBjb2xvcnMsIAogICAgICAgICAgICBuYW1lICAgPSAnJywKICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIGxpbSwgbGVuZ3RoPW5icmVhayksIAogICAgICAgICAgICBsYWJlbHMgPSBjKHNlcSgwLCBsaW0sIGxlbmd0aD1uYnJlYWspWzE6KG5icmVhay0xKV0sIHBhc3RlKCI+IixsaW0pKSAKICAgICAgICApICsKICAgICAgICBsYWJzKHggPSAiciBbw4VdIiwgeT0iVGltZSBbcHNdIikgKwogICAgICAgIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpICsgCiAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkgKwogICAgICAgIGZhY2V0X3dyYXAofmVwc2t0KQpgYGAKCg==