Origin 绘制反应能量图
前言
反应能量图(reaction energy diagram)是 DFT 计算中展现化学反应的重要方式,OriginLab 官方也提供了很有意思的方案来绘制这样的路径图。本文将以下图中的一条路径为例,对官方提供的方案进行详细解释和扩展。
绘图思路
使用 Origin 绘制大部分图像都需要明确以下两点:
- 数据点的表现形式
- 数据点之间的连接方式
本图与最常见的“Line”图十分相近,但实际数据却区别于“Line”图需要的数据。“Line”图是将一个个数据点连接成线,但本例中每一个中间产物只对应一个能量。也就是说,数据是不具有“平台”这个概念的,而图中却要将其表现出“平台”的样式。
由此思路,我们得到了第一种绘图方法:人为地扩展数据点的横坐标。假设原数据为 (A, 1.5)
,那么在绘图时,手动增加 (A-1, 1.5)
、(A+1, 1.5)
两个点,即可得到“平台”的效果。
然而,当反应的中间路径较多时,人为增加数据点是十分困难的。由此,官方提供了一个非常巧妙的方法,即 Floating Column。Floating Column 本是柱状图的一种,数据至少分为三列:X、Y 下界、Y 上界。
利用柱状图绘制具备天然的优势,即:柱状图宽度可调、可进行数据间的连接,连接线样式可独立调整。当上界与下界数据相同时,柱状图的高度为零,其本身的宽度即可作为我们的“平台”。
数据准备
初始数据
一般的,初始数据如下图所示,X 列为路径编号,每个 Y 列的 Long Name
为反应路径名,数值为反应能,从左至右为反应路径顺序。
数据转置
由于柱状图每一行为一个数据点,为满足柱状图的数据要求,需要将数据转置。使用 Restructure: Transpose 转置后,从上至下为反应路径顺序。
生成制图数据
在执行本 Labtalk 命令时,当前活动工作簿的第二个工作表会被覆盖,请确保第二个工作表内为空或没有有效数据!
由于需要两列相同的数据分别作为 Floating Column 的上界和下界,这里使用 Labtalk 脚本进行生成。通过 Window: Command Window 打开脚本窗口,应用以下脚本,在文末将对该脚本进行详细解析。
1 | newsheet; |
最后,新增一列作为路径编号(令 F(x) = i
生成正整数递增列,即行号),并将列类型设置为 XYY
。
图像绘制
第一条路径
本绘图方法中,每一条路径都需要独立绘制,每次选择一组数据。
选中 B、C 列,选择 Plot: Bar -> Floating Columns 制图,但此时图中是没有图像的,这是由于当柱状图高度为零时,Origin 默认不显示。我们可以通过 Labtalk 命令 page.BarShowZero = 1
或者勾选 Preference: Options -> Bar graph show Zero Value 令其显示。
数据连接
利用数据连接功能,我们可以将每个柱子连接起来,并自定义线形。
增加多条路径
如果需要绘制的路径不止一条,可以利用 Origin 的 Add Data to Layer 功能,将其他组数据拖入图像中。
数据标注
这里介绍一个简便方法标注各个中间路径的名称。
- 增加 B 列(名称列)和 C、D 列(全为零);
- 将 C、D 列数据添加至图中,并将该组数据的颜色设置为无色,显示其 Label;
- 保存后即可创建在同一水平线,且与真实数据垂直对齐的标签。
Labtalk 详解
Range
1 | range rsrc = 1!; |
类似于 range a = 1!
是指当前活动工作簿的第一个工作表。本组命令是将数据来源设置为第一个工作表,将目标数据存放在第二个工作表。
参考文档:Range-Notation
New Column
1 | rdst.ncols = rsrc.ncols*2; |
上面我们说过,该 Labtalk 脚本是为了将一列数据复制成两列作为 Floating Column 的下界和上界,ncol
代表的是 new column
。本组命令是将 rdst
的列数设置为 rsrc
的两倍。
Loop
Header
1 | for (int ii = 0; ii < rsrc.ncols; ii++){} |
控制本次循环在遍历完源工作表的所有列后结束。
Body
1 | range r1 = 1!$(ii+1); |
此处 irng
为 input range
,orng
为 output range
。
当 ii = 0
,则 r1
为源工作表的第 1 列, r2
为目标工作表的第 1 列, r3
为目标工作表的第 2 列。接着将源工作表的第 1 列追加到目标工作表的第 1、2 列。
当 ii = 1
,则 r1
为源数据工作表的第 2 列, r2
为目标数据工作表的第 3 列, r3
为目标数据工作表的第 4 列。接着将源工作表的第 2 列追加到目标工作表的第 3、4 列。
由此可见,随着循环的进行,源工作表的每一列都被拷贝成了两列。
环境
- Windows 11 (22000.652);
- Origin 2022b (Academic).
备注
- 本文禁止转载;
- 随着版本更新,您所使用的功能可能与教程中有所不同。