仪器信息网APP
选仪器、听讲座、看资讯

用Wolfram Mathematica画出同步辐射in situ衍射谱

  • iangie
    2013/12/29
    色谱
  • 私聊

X射线衍射仪(XRD)

  • 先介绍一下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高手指正简化下命令....
    +关注 私聊
  • iangie

    第1楼2014/01/02

    应助达人

    你们这些看帖不回帖的.......我画圈圈诅咒你们.......
    自己挽尊吧.........

0
    +关注 私聊
  • wulin321

    第2楼2014/01/03

    应助达人

    这个真不懂 支持一下

0
    +关注 私聊
  • iangie

    第3楼2014/01/03

    应助达人

    其实就是给大量数据画3维地形图....很简单的....

    wulin321(wulin321) 发表:这个真不懂 支持一下

0
    +关注 私聊
  • wulin321

    第4楼2014/01/04

    应助达人

    在你技术范围内你认为简单,我们门外汉就很难了

    iangie(iangie) 发表:其实就是给大量数据画3维地形图....很简单的....

0
    +关注 私聊
  • iangie

    第5楼2014/01/04

    应助达人

    mathematica,matlab,maple称为数学建模三套车。完全是本科水平,所有工科理科的本科毕业生应该都会这个“技术”。

    wulin321(wulin321) 发表:在你技术范围内你认为简单,我们门外汉就很难了

0
    +关注 私聊
  • wulin321

    第6楼2014/01/04

    应助达人

    俺是高职的,怪不得不认得,心理平衡了

    iangie(iangie) 发表:mathematica,matlab,maple称为数学建模三套车。完全是本科水平,所有工科理科的本科毕业生应该都会这个“技术”。

0
0
    +关注 私聊
  • iangie

    第8楼2014/01/05

    应助达人

    xujun提点意见啊~代码肯定还有改进的空间。。。

    MMA的精华在map /@, 俺还不会。。。。

    xujun16(xujun16) 发表:进来学习了

0
    +关注 私聊
  • 黄石道人

    第9楼2014/01/05

    做过原位的同步辐射XRD,当时是把一个时间一个时间的二维图积分成一维,然后再批量导入到origin里。
    楼主这个方法,还是第一次听说。

0
    +关注 私聊
  • iangie

    第10楼2014/01/06

    应助达人

    批量导入Origin画图慢不慢?

    黄石道人(v2722760) 发表:做过原位的同步辐射XRD,当时是把一个时间一个时间的二维图积分成一维,然后再批量导入到origin里。
    楼主这个方法,还是第一次听说。

0
查看更多
猜你喜欢最新推荐热门推荐更多推荐
举报帖子

执行举报

点赞用户
好友列表
加载中...
正在为您切换请稍后...