将 matplotlib 图添加到保存为图像的现有图

Posted

技术标签:

【中文标题】将 matplotlib 图添加到保存为图像的现有图【英文标题】:Adding a matplotlib plot to an existing plot saved as an image 【发布时间】: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'

【问题讨论】:

【参考方案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】:

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

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

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

【讨论】:

以上是关于将 matplotlib 图添加到保存为图像的现有图的主要内容,如果未能解决你的问题,请参考以下文章

Python matplotlib之函数图像绘制、线条rc参数设置

将 Matplotlib 图形保存为全屏图像

Python机器学习入门——科学计算库(Matplotlib)

如何将 Matplotlib 图形转换为 PIL Image 对象(不保存图像)

matplotlib生成指定大小的空白的白色图(故意保存)实战:当然也可以保存正常的有内容的图像

python使用matplotlib可视化线图(line plot)将图像保存为svg格式(将图像保存为pngjpgjpeg等其他格式的语法类似)