【问题标题】:Adding a matplotlib plot to an existing plot saved as an image将 matplotlib 图添加到保存为图像的现有图
【发布时间】:2020-11-11 21:23:00
【问题描述】:

我有一个我之前创建的 matplotlib 图并将其保存为图像(我们称之为 fig-1)。 现在,我有一个脚本可以生成另一个图,我希望该图覆盖在前一张图像上(fig-1)。

由于环境问题,不能用一个脚本生成两个图。

我应该如何进行?

我生成的第一个情节在 python3 中,我必须运行的第二个脚本在 python2 中。这两个环境无法更改,因为一个在 ros2 中运行,第二个在 ros1 中运行。

python3 中腌制第一个情节,然后尝试在 python2 中取消腌制它,我遇到以下错误:

  Traceback (most recent call last):
  File "./latencycheckclient.py", line 58, in <module>
    fig_handle = pl.load(file('/home/arusarka/dev_ws/src/devel_space/devel_space/ros2_latency.pickle','rb'))
  File "/usr/lib/python2.7/pickle.py", line 1384, in load
    return Unpickler(file).load()
  File "/usr/lib/python2.7/pickle.py", line 864, in load
    dispatch[key](self)
  File "/usr/lib/python2.7/pickle.py", line 1223, in load_build
    setstate(state)
  File "/usr/lib/python2.7/dist-packages/matplotlib/transforms.py", line 1684, in __setstate__
    self._init(state['child'])
KeyError: u'child'

【问题讨论】:

    标签: python python-3.x python-2.7 matplotlib pickle


    【解决方案1】:

    如果您仍然有机会运行创建原始图像 fig-1 的脚本(这是真的,如果我理解正确的话),您可以将该图保存为 *.pickle 文件并再次加载供以后添加其他内容。

    假设以下脚本创建了 fig-1:

    # Script1
    import numpy as np
    import matplotlib.pyplot as plt
    import pickle as pl
    
    # Plot simple sinus function
    fig_handle = plt.figure()
    x = np.linspace(0,2*np.pi)
    y = np.sin(x)
    plt.plot(x,y)
    

    使用以下 sn-p,您可以将绘图(更准确地说是 matplotlib.figure.Figure 对象)转储为例如fig_handle*.pickle 文件中

    # Save figure handle to disk
    pl.dump(fig_handle, open('sinus.pickle','wb'))
    

    您现在可以在单独的脚本中再次加载 figure_handle 对象

    # Script2 
    import matplotlib.pyplot as plt
    import pickle as pl
    import numpy as np
    
    # Load figure from disk and display
    fig_handle = pl.load(open('sinus.pickle','rb'))
    

    甚至从中检索或操作数据

    x_old = fig_handle.axes[0].lines[0].get_data()[0]
    y_old = fig_handle.axes[0].lines[0].get_data()[1]
    x_new = x_old * .75 + 1
    y_new = y_old * -.35
    
    plt.plot(x_old, y_old)
    plt.plot(x_new, y_new)
    

    这样您就可以将新图覆盖在原始图的数据上

    【讨论】:

    • 我生成的第一个图在 python3 中,我必须运行的第二个脚本在 python2 中。这两个环境无法更改,因为一个在 ros2 中运行,第二个在 ros1 中运行。使用您提到的代码 sn-ps 运行脚本后,我收到以下错误:File "/usr/lib/python2.7/dist-packages/matplotlib/transforms.py", line 1684, in __setstate__ self._init(state['child']) KeyError: u'child'
    • 在 python 2.7 中函数 open 不存在。尝试使用file 而不是pl.load function
    • 使用file函数也出现同样的错误。我将其附加在问题中。
    【解决方案2】:

    你不能直接这样做。有一些变通方法:

    1. 您可以尝试编辑图片,类似 Photoshop。
    2. 您可以尝试在 python 中读取 .jpg 文件并将其“逐像素”合并,但这很头疼。只有当所有轴都相同时,您才能执行此操作。它将类似于:“如果像素在一个图像中是白色的,而不是在另一个图像中,则只取非白色的那个”。您可以通过这种方式构建一张将两者合并的照片。有点像面具。但轴必须相同,图像必须大小相同。
    3. 我想 NN 从图中识别数据是一项简单的任务。我不熟悉这样做的网络,但我应该太难了。考虑到这一点,您可以在 fig-1 上运行它并提取数据。然后,您可以创建一个脚本,将这两个数据组合到同一张图像上。

    最简单的解决方案是在同一个脚本上创建这两个脚本...如果您可以访问这两个脚本,您可以修改它们以返回数据对象并将它们绘制在一起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-02
      • 2018-06-06
      • 2016-09-16
      • 2019-09-17
      • 1970-01-01
      • 2012-12-03
      • 2013-02-07
      • 2020-12-21
      相关资源
      最近更新 更多