You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多个matplotlib.figure.Figure对象合并为单个图形

合并两个Matplotlib Figure为单个Figure的子图

要实现将两个独立返回的matplotlib.figure.Figure合并为一个新Figure的子图,有两种可行方案,分别适用于矢量格式保留和快速实现场景:

方案一:保留矢量格式(移植原Axes到新Figure)

该方案会将原Figure中的所有坐标轴(Axes)直接移植到新Figure的子图区域,保留矢量图形的可编辑特性:

代码示例

import matplotlib.pyplot as plt
from matplotlib.transforms import Bbox

# 模拟返回Figure的函数(替换为你的实际函数)
def generate_figure1():
    fig, axes = plt.subplots(2, 2, figsize=(6, 4))
    axes[0,0].plot([1, 2, 3], label="Line")
    axes[0,1].scatter([1, 2], [3, 4], color="red")
    axes[1,0].bar([1, 2], [5, 6], color="green")
    axes[1,1].pie([1, 2, 3], labels=["A", "B", "C"])
    fig.suptitle("Original Figure 1")
    return fig

def generate_figure2():
    fig, ax = plt.subplots(figsize=(6, 4))
    ax.imshow([[1, 2], [3, 4]], cmap="viridis")
    ax.set_title("Original Figure 2")
    return fig

# 获取原Figure
fig1 = generate_figure1()
fig2 = generate_figure2()

# 创建新Figure,设置2行1列的子图布局
new_fig = plt.figure(figsize=(8, 10))

# 处理第一个原Figure
subplot_1 = new_fig.add_subplot(2, 1, 1)
subplot_1.axis("off")  # 隐藏占位子图的坐标轴
bbox_1 = subplot_1.get_position()  # 获取占位子图的位置范围
fig1_w, fig1_h = fig1.get_size_inches()
# 计算位置缩放比例,适配新子图区域
scale_x1 = bbox_1.width / fig1_w
scale_y1 = bbox_1.height / fig1_h

# 移植原Figure1的所有Axes到新Figure
for ax in fig1.get_axes():
    orig_pos = ax.get_position()
    # 转换为新Figure中的位置坐标
    new_pos = Bbox.from_extents(
        bbox_1.x0 + orig_pos.x0 * scale_x1,
        bbox_1.y0 + orig_pos.y0 * scale_y1,
        bbox_1.x0 + orig_pos.x1 * scale_x1,
        bbox_1.y0 + orig_pos.y1 * scale_y1
    )
    ax.set_position(new_pos)
    new_fig.add_axes(ax)

# 处理第二个原Figure
subplot_2 = new_fig.add_subplot(2, 1, 2)
subplot_2.axis("off")
bbox_2 = subplot_2.get_position()
fig2_w, fig2_h = fig2.get_size_inches()
scale_x2 = bbox_2.width / fig2_w
scale_y2 = bbox_2.height / fig2_h

for ax in fig2.get_axes():
    orig_pos = ax.get_position()
    new_pos = Bbox.from_extents(
        bbox_2.x0 + orig_pos.x0 * scale_x2,
        bbox_2.y0 + orig_pos.y0 * scale_y2,
        bbox_2.x0 + orig_pos.x1 * scale_x2,
        bbox_2.y0 + orig_pos.y1 * scale_y2
    )
    ax.set_position(new_pos)
    new_fig.add_axes(ax)

# 关闭原Figure,避免额外弹出窗口
plt.close(fig1)
plt.close(fig2)

# 显示新合并的Figure
plt.show()

方案二:快速实现(渲染为图像后显示)

如果不需要保留矢量格式,可将原Figure渲染为位图图像,再在新Figure的子图中显示,操作更简单:

代码示例

import matplotlib.pyplot as plt

# 模拟返回Figure的函数
def generate_figure1():
    fig, axes = plt.subplots(2, 2, figsize=(6, 4))
    axes[0,0].plot([1, 2, 3])
    axes[0,1].scatter([1, 2], [3, 4])
    axes[1,0].bar([1, 2], [5, 6])
    axes[1,1].pie([1, 2, 3])
    fig.suptitle("Original Figure 1")
    return fig

def generate_figure2():
    fig, ax = plt.subplots(figsize=(6, 4))
    ax.imshow([[1, 2], [3, 4]])
    ax.set_title("Original Figure 2")
    return fig

# 获取原Figure
fig1 = generate_figure1()
fig2 = generate_figure2()

# 将原Figure渲染为RGBA图像
fig1.canvas.draw()
img1 = fig1.canvas.buffer_rgba()

fig2.canvas.draw()
img2 = fig2.canvas.buffer_rgba()

# 创建新Figure和子图
new_fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 10))

# 在子图中显示原Figure的图像
ax1.imshow(img1)
ax1.axis("off")  # 隐藏坐标轴,只显示原Figure内容
ax2.imshow(img2)
ax2.axis("off")

# 关闭原Figure
plt.close(fig1)
plt.close(fig2)

plt.show()

内容的提问来源于stack exchange,提问作者Chrisanto Sinatra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 23:40:55