origin结合python复刻图表

本文主要介绍使用python和origin进行图表复刻 以下图为例

第一步 打开origin软件后,然后依次点击工具—>图像数字化工具。界面如下图所示

第二步 导入图片

第三步 自定义坐标

x1 x2 和 y1 y2 分别代表着图表x轴和y轴的最大值与最小值。点击坐标值修改数值后拖动左边相对应的标尺,使得与数值一一对应。

修改后的图片如图所示

第四步 取点(取大概点即可)

这里使用手动取点。取完点后按CTRL+enter 。之后数据会保存在项目管理器中的digidata工作表中。

第五步 数据优化

由于手动取点或者自动取点后,数据会产生少许偏差,导致生成的图标与原图相差甚大(如下图所示),因此这里使用内置python脚本对数据进行处理。(也可使用origin内置的函数进行优化)

  • 在origin内部打开python
    在origin主界面—>菜单栏—>连接—>打开untitled.py 界面如下图所示
  • 在空白界面输入以下代码
    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
    38
    39
    40
    41
    42
    43
    import pandas as pd
    import numpy as np
    from scipy.interpolate import make_interp_spline
    import originpro as op
    from scipy.interpolate import UnivariateSpline

    def main():
    # 使用op.find_sheet()找到活动的工作表
    ws = op.find_sheet()
    #wb = op.find_sheet('m','sheet1')


    # 读取数据
    X1 = np.array(ws.to_list(0)) #
    X2 = np.array(ws.to_list(2)) #
    y1 = np.array(ws.to_list(1)).ravel() #
    y2 = np.array(ws.to_list(3)).ravel() #

    # 打印数据以检查
    #print(X, y)

    # 优化数据使其平滑
    # 首先,我们需要确定新的x值,这里我们使用原始x值的线性插值
    new_x1 = np.linspace(X1[0], X1[-1], 300) # 生成300个新的x值
    new_x2 = np.linspace(X2[0], X2[-1], 100)
    spl1 = UnivariateSpline(X1, y1, k=3) # k是样条曲线的阶数
    new_y1 = spl1(new_x1) # 计算新的y值
    spl2 = UnivariateSpline(X2, y2, k=3) # k是样条曲线的阶数
    new_y2 = spl2(new_x2) # 计算新的y值
    # 将处理后的数据写回工作表
    wks=op.new_sheet()
    wks.from_list(0,new_x1)
    wks.from_list(1,new_y1)
    wks.from_list(2,new_x2)
    wks.from_list(3,new_y2)
    #ws.from_df()


    # 运行主函数
    if __name__ == '__main__':
    main()


  • 安装相应的包
    在下图所示的位置依次输入 pip install numpy pip install pandas pip install scipy
    返回已成功安装即可

  • 在当前界面按f5即可运行脚本。也可以在origin主界面的菜单栏—>窗口—>脚本窗口中输入run -pyf “代码文件名”.py;(如下图所示 book1为源数据,book2为优化后的数据)运行成功后会在origin主界面生成优化后的数据。在进行作图即可。

下图为最终图表(可修改k值以达到最佳)