繁体   English   中英

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

[英]Adding a matplotlib plot to an existing plot saved as an image

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

由于环境问题,这两个图都不能由单个脚本生成。

我应该如何进行?

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

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

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

如果您仍然有机会运行创建原始图像 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)

图。1

使用以下代码段,您可以将 plot(更精确的是matplotlib.figure.Figure对象)转储为*.pickle fig_handle中的 fig_handle

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

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

# 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)

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

图2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM