Post

Origin Lab

Origin Lab

记录一些origin偷懒小玩具

%Y:用户文件夹路径,可以把自己搓的小玩意放在这里,labtalk脚本里%Y调用

小玩具

raw_data

操作表格示例,把荧光仪测试的数据删掉前12行,第一列注释,第二列X,后续每隔两列删一列:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import PyOrigin as po

# 获取当前活动工作表
wks = po.ActiveLayer()

# 获取工作表的列数
num_columns = wks.Cols

# 将第一列设置为注释类型(通常用于忽略)
wks.Columns(0).Type = po.COLTYPE_NONE

# 将第二列设置为X列
wks.Columns(1).Type = po.COLTYPE_X

# 计算要删除的列(从第4列开始,每隔两列删除一列)
columns_to_delete = list(range(3, num_columns, 2))

# 从后向前删除指定列,以避免删除操作影响后续列的索引
for col_index in sorted(columns_to_delete, reverse=True):
    wks.DeleteCol(col_index)

# 将剩余的Y列设置为Y类型
for i in range(2, len(wks.Columns)):
    if i % 2 == 0:  # 偶数列(Python索引从0开始,所以实际上是奇数列)
        wks.Columns(i).Type = po.COLTYPE_Y

for i in range(12):
    wks.DeleteRow(0)  # 因为Python索引从0开始,每次删除第0行,后面的行会自动上移

print(f"已删除 {len(columns_to_delete)} 列重复的X轴数据。")
print(f"当前工作表还剩 {len(wks.Columns)} 列。")
print("列类型已设置为:注释-X-Y-Y-Y-...")

也可以用origin内置的python环境运行

1
run -pyf raw_data.py

修改图片

一些基本操作可以如此进行:

1
2
3
4
5
6
7
8
9
// 修改xy轴标题
label -yl \b(Absorbance);
label -xl \b(Wavelength (nm));
// 取消图例边框
legend.showFrame = 0;
// 设置坐标轴范围
layer.y.from = 0;
layer.x.from = 300;
layer.x.to = 800;

拟合

拟合的R2表格事实上是一串文本

1
2
3
4
5
6
方程	y = a + b*x
绘图	B
截距	0.96919 ± 0.09937
斜率	0.99917 ± 0.02884
R平方(COD)	0.99917
调整后R平方	0.99833

可以用脚本直接转换成论文里使用的字符串形式

  • fitp.py (手动粘贴)
  • clipfit.exe (读取剪切板) 把clipfit.exe放到用户文件夹,自定义菜单里添加:
    1
    
    run -e "%Y\clipfit.exe";
    

    可以转换剪切板上的拟合表格

    1
    2
    
    y=0.9992x+0.9692
    R^2=0.9992
    

smooth插件

有个叫PiecewiseSmooth的插件,可以平滑化,但是批量处理的时候每一列都要单独开一次对话框,非常烦人。索性改源码弄个一键按照预设参数平滑化

安装PiecewiseSmooth插件,用修改过的cpp和ogs替换原有文件,然后在自定义菜单里添加

1
run.section("%@APiecewise Smooth\launch.ogs", launchQuick);

就可以直接调用平滑功能。

如果想批量,可以用这个脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import PyOrigin as po

wks = po.ActiveLayer()
if not wks or not wks.IsValid():
    raise RuntimeError("没有有效的活动工作表。请先激活一个工作表。")

# 1) 找到 X 列(GetType()==3 表示 X),取其短名(如 A)
x_idx = None
for i in range(wks.GetColCount()):
    if wks.Columns(i).GetType() == 3:
        x_idx = i
        break
if x_idx is None:
    x_idx = 0

x_name = wks.Columns(x_idx).GetName()     # 例如 A
book   = wks.GetPage().GetName()          # 例如 Book1
sheet  = wks.GetName()                    # 例如 Sheet1

# 2) 获取当前选中的列(Y 列们)
sel = wks.GetSelectedColumns()

# 3) 循环:每个 Y 列都作 launchColumn,然后执行原样的 run.section(...)
for idx in sel:
    if idx == x_idx:
        continue

    y_name = wks.Columns(idx).GetName()   # 例如 H / I
    rng = f'[{book}]{sheet}!({x_name},{y_name})'   # 例如 [Book1]Sheet1!(A,H)

    lt = (
        f'launchColumn={idx+1};'
        f'run.section("%@APiecewise Smooth\\launch.ogs", launchColumn, "{rng}");'
    )

    wks.LT_execute(lt)

This post is licensed under CC BY 4.0 by the author.
Total hits!