我在 MacOS 上使用 Matplotlib 和 Sulime Text。
我使用 Python 3.5
和 Matplotlib 2.0
。
当我处理图形时,我通常有一个脚本来绘制数据,并使用 plt.savefig()
将图形保存在 .pdf 文件中。然后我使用 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()
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()
当然,在那种情况下,我将不得不与主脚本分开执行首次运行的脚本。有谁知道这是否可能?
最佳答案
您希望多个连续的 python session 共享一个公共(public) Matplotlib 窗口。我看不出有什么办法可以从不同的进程中共享这个窗口,尤其是当原始所有者可能随时终止时。
但是,您可以执行类似于当前工作流程的操作,在该工作流程中,您有一个外部 pdf 查看器来查看您从多个 python 实例更新的输出文件。
请参阅有关如何腌制 matplotlib 图的问题/答案: Store and reload matplotlib.pyplot object
在每个脚本中,将您的 matplotlib 图输出为腌制对象,而不是调用 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'))
然后,启动一个专用的 python session ,它加载这个腌制对象并调用 plt.show()。让这个脚本循环运行,检查磁盘上腌制文件的更新,并在必要时重新加载:
import matplotlib.pyplot as plt
import pickle
while True:
ax = pickle.load(file('myplot.pickle'))
plt.show()
备选
我通常没有单独的 python session ,而是有一个运行不同脚本的 Ipython session 。通过选择相同的图形窗口,我最终得到了与您描述的基本相似的设置,其中全天重复使用相同的图形窗口。
import matplotlib.pyplot as plt
fig = plt.figure(0)
fig.clf()
plt.show()
关于python - Matplotlib 重用由另一个脚本创建的图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42367523/