我有一个返回
plt.figure()
的 API。我调用 API 3 次,生成三个不同的数字。
f1 = plt.figure()
f2 = plt.figure()
f3 = plt.figure()
我想并排显示它们,所以我创建了一个像这样的新图形:
fig, axes = plt.subplots(nrows=1, ncols=3)
如何使用我通过 API 创建的
axes
填充每个 plt.figure()
?
简而言之,我想填充这些:
您正在尝试将一个图形嵌入到另一个图形中,请参阅此处。我认为这是可能的,尽管没有通过 matplotlib 的适当支持,而不深入研究包的内部机制。我建议通过提取数据来重新创建子图。如果数据与图形本身相关,则可以从轴本身提取数据。假设数据按行排列,提示可能是以下代码;
import matplotlib.pyplot as plt, numpy as np
figs = []
for _ in range(3):
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title(f'Dummy{_}')
h1 = ax.plot(np.random.rand(10,2))[0]
figs.append(fig)
def update(axes, figs):
for axi, figi in zip(axes, figs):
for axj in figi.axes:
for line in axj.lines:
x, y = line.get_data()
axi.plot(x, y)
axi.figure.canvas.draw_idle()
return axes
print(figs[0].axes[0].lines)
fig, ax = plt.subplots(1, 3)
ax[1].set_title('Recreated figure')
update(ax, figs)
fig.show()
有一种方法可以做到这一点,尽管它不是很优雅。对于您想要在较大图中作为轴的每个图形,首先将其转换为图像数组:
import PIL
fig.canvas.draw()
rgba_bytes = fig.canvas.buffer_rgba().tobytes()
width, height = fig.canvas.get_width_height()
pil_image = PIL.Image.frombytes(
mode="RGBA",
size=[width, height],
data=rgba_bytes,
)
image_array = np.array(pil_image)
现在,在较大的图中,创建一堆子图,并在每个子图中显示每个图的图像数组(并记住隐藏垂直轴和水平轴):
axis.imshow(image_array)
axis.axis("off")