Origin 绘制反应能量图

前言

反应能量图(reaction energy diagram)是 DFT 计算中展现化学反应的重要方式,OriginLab 官方也提供了很有意思的方案来绘制这样的路径图。本文将以下图中的一条路径为例,对官方提供的方案进行详细解释和扩展。

10.1038/s41467-022-29428-9

绘图思路

使用 Origin 绘制大部分图像都需要明确以下两点:

  1. 数据点的表现形式
  2. 数据点之间的连接方式

本图与最常见的“Line”图十分相近,但实际数据却区别于“Line”图需要的数据。“Line”图是将一个个数据点连接成线,但本例中每一个中间产物只对应一个能量。也就是说,数据是不具有“平台”这个概念的,而图中却要将其表现出“平台”的样式。

由此思路,我们得到了第一种绘图方法:人为地扩展数据点的横坐标。假设原数据为 (A, 1.5),那么在绘图时,手动增加 (A-1, 1.5)(A+1, 1.5) 两个点,即可得到“平台”的效果。

然而,当反应的中间路径较多时,人为增加数据点是十分困难的。由此,官方提供了一个非常巧妙的方法,即 Floating Column。Floating Column 本是柱状图的一种,数据至少分为三列:X、Y 下界、Y 上界。

Floating Column Graph

利用柱状图绘制具备天然的优势,即:柱状图宽度可调可进行数据间的连接连接线样式可独立调整。当上界与下界数据相同时,柱状图的高度为零,其本身的宽度即可作为我们的“平台”。

数据准备

初始数据

一般的,初始数据如下图所示,X 列为路径编号,每个 Y 列的 Long Name 为反应路径名,数值为反应能,从左至右为反应路径顺序。

数据转置

由于柱状图每一行为一个数据点,为满足柱状图的数据要求,需要将数据转置。使用 Restructure: Transpose 转置后,从上至下为反应路径顺序。

生成制图数据

在执行本 Labtalk 命令时,当前活动工作簿的第二个工作表会被覆盖,请确保第二个工作表内为空或没有有效数据

由于需要两列相同的数据分别作为 Floating Column 的上界下界,这里使用 Labtalk 脚本进行生成。通过 Window: Command Window 打开脚本窗口,应用以下脚本,在文末将对该脚本进行详细解析。

1
2
3
4
5
6
7
8
9
10
11
12
newsheet;
range rsrc = 1!;
range rdst = 2!;
rdst.ncols = rsrc.ncols*2;
for (int ii = 0; ii < rsrc.ncols; ii++)
{
range r1 = 1!$(ii+1);
range r2 = 2!$(2*ii+1);
range r3 = 2!$(2*ii+2);
colcopy irng:=r1 orng:=r2;
colcopy irng:=r1 orng:=r3;
}

最后,新增一列作为路径编号(令 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 功能,将其他组数据拖入图像中。

数据标注

这里介绍一个简便方法标注各个中间路径的名称。

  1. 增加 B 列(名称列)和 C、D 列(全为零);
  1. 将 C、D 列数据添加至图中,并将该组数据的颜色设置为无色,显示其 Label;

  1. 保存后即可创建在同一水平线,且与真实数据垂直对齐的标签。

Labtalk 详解

Range

1
2
range rsrc = 1!; 
range rdst = 2!;

类似于 range a = 1! 是指当前活动工作簿的第一个工作表。本组命令是将数据来源设置为第一个工作表,将目标数据存放在第二个工作表。

参考文档:Range-Notation

New Column

1
rdst.ncols = rsrc.ncols*2;

上面我们说过,该 Labtalk 脚本是为了将一列数据复制成两列作为 Floating Column 的下界和上界,ncol 代表的是 new column。本组命令是将 rdst 的列数设置为 rsrc 的两倍。

参考文档:Basic Worksheet Column

Loop

1
for (int ii = 0; ii < rsrc.ncols; ii++){}

控制本次循环在遍历完源工作表的所有列后结束。

Body

1
2
3
4
5
range r1 = 1!$(ii+1);
range r2 = 2!$(2*ii+1);
range r3 = 2!$(2*ii+2);
colcopy irng:=r1 orng:=r2;
colcopy irng:=r1 orng:=r3;

此处 irnginput rangeorngoutput range

ii = 0,则 r1 为源工作表的第 1 列, r2 为目标工作表的第 1 列, r3 为目标工作表的第 2 列。接着将源工作表的第 1 列追加到目标工作表的第 1、2 列。

ii = 1,则 r1 为源数据工作表的第 2 列, r2 为目标数据工作表的第 3 列, r3 为目标数据工作表的第 4 列。接着将源工作表的第 2 列追加到目标工作表的第 3、4 列。

由此可见,随着循环的进行,源工作表的每一列都被拷贝成了两列。

参考文档:Getting Started with LabTalk

环境

  1. Windows 11 (22000.652);
  2. Origin 2022b (Academic).

备注

  1. 本文禁止转载;
  2. 随着版本更新,您所使用的功能可能与教程中有所不同。