我在 MacOS 上使用 Matplotlib 和 Slime Text。我使用Python 3.5和Matplotlib 2.0。
当我处理图形时,我通常有一个脚本来绘制数据,并将图形保存在一个 .pdf 文件中,扩展名为 .pdf 文件plt.savefig()。然后我使用Skim(pdf 查看器)以便在每次修改和运行脚本时刷新文件。这允许我将我的工作布局设置为干净:脚本有一个窗口,图形有一个窗口会自动刷新。
我想保持相同的布局,但使用 Matplotlib 图形(因为它们是交互式的)。我正在寻找一种使用方法,plt.show()但始终与我第一次运行脚本时创建的图形相同。
例如:
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)
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)
当然,在这种情况下,我将不得不与主脚本分开执行首次运行脚本。有谁知道这是否可能?
您希望多个连续的 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)