Matplotlib 重用由另一个脚本创建的图形

Léo*_*ard 7 python matplotlib

我在 MacOS 上使用 Matplotlib 和 Slime Text。我使用Python 3.5Matplotlib 2.0

当我处理图形时,我通常有一个脚本来绘制数据,并将图形保存在一个 .pdf 文件中,扩展名为 .pdf 文件plt.savefig()。然后我使用Skim(pdf 查看器)以便在每次修改和运行脚本时刷新文件。这允许我将我的工作布局设置为干净:脚本有一个窗口,图形有一个窗口会自动刷新。

我想保持相同的布局,但使用 Matplotlib 图形(因为它们是交互式的)。我正在寻找一种使用方法,plt.show()始终与我第一次运行脚本时创建的图形相同

例如:

1.第一次运行

import matplotlib.pyplot as plt
import numpy as np 

fig, ax = plt.figure()    

noise = np.random.rand(1, 100)
ax(noise)
plt.show()
Run Code Online (Sandbox Code Playgroud)

2. 后续运行

import matplotlib.pyplot as plt
import numpy as np 

# This is the super command I am looking for
fig = plt.get_previous_run_figure()
ax = fig.axes

noise = np.random.rand(1, 100)
ax.plot(noise)
plt.draw()
Run Code Online (Sandbox Code Playgroud)

当然,在这种情况下,我将不得不与主脚本分开执行首次运行脚本。有谁知道这是否可能?

Daa*_*aan 4

您希望多个连续的 python 会话共享一个公共 Matplotlib 窗口。我认为没有办法从单独的进程共享此窗口,特别是当原始所有者可能随时终止时。

但是,您可以执行类似于当前工作流程的操作,其中您有一个外部 pdf 查看器来查看从多个 python 实例更新的输出文件。

请参阅此问题/答案,了解如何腌制 matplotlib 图: 存储并重新加载 matplotlib.pyplot 对象

在每个脚本中,将 matplotlib 图形输出为 pickled 对象,而不是调用 plt.show():

import matplotlib.pyplot as plt
import numpy as np
import pickle

ax = plt.subplot(111)
x = np.linspace(0, 10)
y = np.exp(x)
plt.plot(x, y)
pickle.dump(ax, file('myplot.pickle', 'w'))
Run Code Online (Sandbox Code Playgroud)

然后,启动一个专用的 python 会话,加载这个 pickled 对象并调用 plt.show()。让此脚本循环运行,检查磁盘上腌制文件的更新,并在必要时重新加载:

import matplotlib.pyplot as plt
import pickle

while True:
   ax = pickle.load(file('myplot.pickle'))
   plt.show()
Run Code Online (Sandbox Code Playgroud)

选择

我通常没有单独的 python 会话,而是在一个 Ipython 会话中运行不同的脚本。通过选择相同的图形窗口,我最终得到了与您描述的基本相似的设置,其中全天重复使用相同的图形窗口。

import matplotlib.pyplot as plt

fig = plt.figure(0)
fig.clf()

plt.show()
Run Code Online (Sandbox Code Playgroud)