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

Matplotlib中如何将已有Figure添加至子图(Subplot)

解决Matplotlib将已有Figure合并为共享X轴子图的问题

嘿,我来帮你搞定这个Matplotlib的小难题!首先得指出你代码里的两个关键问题:一是你试图把Figure对象(f_1、f_2)直接赋值给new_ax里的Axes实例,这完全行不通——它们是两种不同类型的对象,没法直接替换;二是你原来的函数里有个小笔误:put.subplots()应该是plt.subplots(),这个得先修正哦。

下面给你两种解决方案,优先推荐第一种,更规范灵活:

方法一:修改绘图函数,接受外部Axes(推荐)

这种思路是让你的绘图函数不再自己创建Figure和Axes,而是可以接受外部传入的Axes对象来绘图。这样就能直接在我们创建的共享X轴子图上绘制内容,完美解决需求。

修改后的绘图函数

import matplotlib.pyplot as plt

def plot_fig_1(vars, args, ax=None):
    # 如果没有传入ax,就自己创建一个(保留函数单独使用的能力)
    if ax is None:
        f, ax = plt.subplots()
    # 这里替换成你实际的绘图逻辑
    x = vars["x1"]
    y = args["y1"]
    ax.plot(x, y)
    ax.set_title("Figure 1")
    ax.set_ylabel("Y1 Value")
    return ax  # 如果需要也可以返回f,但这里用外部ax的话,figure是外部的

def plot_fig_2(vars, args, ax=None):
    if ax is None:
        f, ax = plt.subplots()
    # 实际绘图逻辑
    x = vars["x2"]
    y = args["y2"]
    ax.plot(x, y)
    ax.set_title("Figure 2")
    ax.set_ylabel("Y2 Value")
    ax.set_xlabel("X Value")  # 因为共享X轴,只在底部子图设置X标签即可
    return ax

合并为共享X轴的子图

# 创建2行1列的子图,设置sharex=True实现共享X轴
new_fig, new_ax = plt.subplots(2, 1, sharex=True, figsize=(8, 6))

# 把新创建的Axes传入函数,直接在上面绘图
plot_fig_1(your_vars, your_args, ax=new_ax[0])
plot_fig_2(your_vars, your_args, ax=new_ax[1])

# 调整子图间距,避免标签重叠
plt.tight_layout()
plt.show()

这种方法的好处是:函数既可以单独调用生成独立的Figure,也可以配合外部Axes实现子图合并,灵活性拉满,而且完全符合Matplotlib的最佳实践。

方法二:不修改原函数,迁移已有Figure的内容(备选)

如果因为某些原因你没法修改原来的绘图函数,那可以把已有Figure中Axes的内容复制到新的子图Axes里。不过这种方法比较繁琐,因为要逐个复制绘图元素:

import matplotlib.pyplot as plt

# 先调用原函数生成两个Figure
f_1, ax_1 = plot_fig_1(your_vars, your_args)
f_2, ax_2 = plot_fig_2(your_vars, your_args)

# 创建共享X轴的新子图
new_fig, new_ax = plt.subplots(2, 1, sharex=True, figsize=(8, 6))

# 复制第一个图的线条和属性到新子图
for line in ax_1.get_lines():
    # 复制线条的x/y数据和样式属性
    new_ax[0].plot(line.get_xdata(), line.get_ydata(), **line.get_properties())
# 复制标题、Y轴标签
new_ax[0].set_title(ax_1.get_title())
new_ax[0].set_ylabel(ax_1.get_ylabel())

# 复制第二个图的内容
for line in ax_2.get_lines():
    new_ax[1].plot(line.get_xdata(), line.get_ydata(), **line.get_properties())
new_ax[1].set_title(ax_2.get_title())
new_ax[1].set_ylabel(ax_2.get_ylabel())
new_ax[1].set_xlabel(ax_2.get_xlabel())

# 关闭原来的两个Figure,避免弹出多余窗口
plt.close(f_1)
plt.close(f_2)

plt.tight_layout()
plt.show()

注意:如果你的原图里还有散点、图例、注释等其他元素,需要额外编写代码复制这些元素,所以这种方法只适合简单的折线图场景,优先用方法一哦。

内容的提问来源于stack exchange,提问作者Arnold Klein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:05:42