先介绍一下in situ原位衍射数据的叠加图. 它是一张的横坐标为2theta 角度, 纵坐标可以是数据标号, 温度, 压强, 反应时间等表征原位实验进度的参数. 例子如下图( Scarlett, N.V.Y., Madsen, I.C. and Whittington, B.I., 2008. J. Appl. Crystallogr., 41(1): 572–583.)
所以, 这样的"accumulated XRD patterns" 可以观察随实验进程的物相变化.
但是, 什么样的软件才能画出这种叠加图来呢?. ....哪位版友要是知道有什么共享软件请告之下... 好多都很贵的....
我手头只有mathematica 9.0, 我决定自己画........
我的in situ data比较简单, 只有38个谱, 每个谱大约20000个数据点(角度, 强度, error) .xye格式
下面分享下我的matehmatica画图程序:
ClearAll["`*"]
data = ReadList[#, {Number, Number, Number}] & /@ FileNames["C:\\insitu\\Path\\Spain_00*_ss.xye"]; (*读入37个xye格式的文件\文件名是Spain_0001_ss.xye 到 Spain_0038_ss.xye \每个大概有850kb\所以一共是20多Mb的数据, 注意路径用两个反斜杠隔开*)
For[i = 1, i < 39, i++, {theta2, intensity, error} = Transpose[data[]]]; (*把每个xye数据转置分成角度列 强度列和误差列 注意这37个数据的长度还不一样, 20000+-, 每个谱也没有对正, 每个谱的2 theta 角度采样点也不一样*)
For[i = 1, i < 39, i++, XY = Transpose[{Take[theta2, {2000, 20000}], Take[intensity, {2000, 20000}]}]]; (*舍去误差列数据 把数据转置回来 只取中间18001个数据*)
For[i = 1, i < 39, i++, {f = Interpolation[XY], XYgrid = Table[f[t], {t, 15, 80, 0.01}]}] array = Table[XYgrid, {i, 1, 38}]; (*把数据spline插值后, 只取均匀的6500个点来画图, 不然Core2 i5 CPU也很慢*)
ListDensityPlot[Log[array], ColorFunction -> "Rainbow", AspectRatio -> 1/GoldenRatio, FrameLabel -> {"2\[Theta]Degree", "Dataset"}, PlotRange -> All, LabelStyle -> Directive[20, FontFamily -> "Times"], FrameTicks -> {{{0, 15}, {500, 20}, {1000, 25}, {1500, 30}, {2000, 35}, {2500, 40}, {3000, 45}, {3500, 50}, {4000, 55}, {4500, 60}, {5000, 65}, {5500, 70}, {6000, 75}, {6500, 80}}, {5, 10, 15, 20, 25, 30, 35}}]
最后用ListDensityPlot来画图, 画出下面这张图耗时45秒:
只要数据对正了 (每个谱中的强度点所对应的2theta 一致) 其实也可以用ArrayPlot或者Image命令来画, 耗时只有15s的样子 但是效果没有DensityPlot这么好, 因为前两个命令没有data点之间的过渡效果~
我的MMA水平很菜, 欢迎哪位MMA高手指正简化下命令....