[英]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'
你不能直接做。 有一些变通方法:
最简单的解决方案是在同一个脚本上创建这两个脚本...如果您可以访问这两个脚本,则修改它们以将数据 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)
使用以下代码段,您可以将 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 的数据上
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.