腌制 matplotlib 图以重用子图

pickling a matplotlib figure to reuse subplots

我正在尝试获取一个脚本生成的图形,对其进行 pickle,然后稍后在不同的范围内加载它以在新图形中重新使用一些子图(我的意思是绘制一个新副本视觉上与旧版相同)。从我所做的有限测试来看,pickling 和重新加载图形对象似乎是重用整个图形的最可靠方法,因为它似乎可以使用所有相同的设置恢复艺术家,这就是为什么我在传递图形对象时进行酸洗。

问题是当我尝试单独使用轴时,新的子图是空白的。我怀疑我遗漏了一些关于如何命令 matplotlib 渲染轴对象的简单但模糊的东西。

这是 Python 3.6.8,matplotlib 3.0.2。欢迎提出建议。

#pickling & reusing figures

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

x = np.linspace(0, 10)
y = np.exp(x)
fig = plt.figure(1)
plt.subplot(2, 2, 1)
plt.plot(x, y)
plt.subplot(2, 2, 2)
plt.plot(x, 2*y)
plt.subplot(2, 2, 3)
plt.plot(x,x)
plt.subplot(2, 2, 4)
plt.plot(x, 2*x)

subplots = fig.axes
plt.show()

with open('plots.obj', 'wb') as file:
    pickle.dump(subplots, file)

plt.close(fig)

#simulation of new scope
with open('plots.obj', 'rb') as file:
    subplots2 = pickle.load(file)

plt.figure()
ax1 = plt.subplot(2,2,1)
subplots2[0]
ax2 = plt.subplot(2,2,2)
subplots2[1]
ax3 = plt.subplot(2,2,3)
subplots2[2]
ax4 = plt.subplot(2,2,4)
subplots2[3]

plt.show()
  • 你需要 pickle 图,而不是轴。
  • 你不应该在酸洗之前关闭图。

所以总共

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

x = np.linspace(0, 10)
y = np.exp(x)
fig = plt.figure(1)
plt.subplot(2, 2, 1)
plt.plot(x, y)
plt.subplot(2, 2, 2)
plt.plot(x, 2*y)
plt.subplot(2, 2, 3)
plt.plot(x,x)
plt.subplot(2, 2, 4)
plt.plot(x, 2*x)

with open('plots.obj', 'wb') as file:
    pickle.dump(fig, file)

plt.show()
plt.close(fig)

#simulation of new scope
with open('plots.obj', 'rb') as file:
    fig2 = pickle.load(file)

# figure is now available as fig2

plt.show()