Matplotlib 图形到轴

问题描述 投票:0回答:2

我有一个返回

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()

简而言之,我想填充这些:

python matplotlib plot plotly
2个回答
1
投票

您正在尝试将一个图形嵌入到另一个图形中,请参阅此处。我认为这是可能的,尽管没有通过 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()


0
投票

有一种方法可以做到这一点,尽管它不是很优雅。对于您想要在较大图中作为轴的每个图形,首先将其转换为图像数组:

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")
© www.soinside.com 2019 - 2024. All rights reserved.