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

Python Pandas:如何将函数生成的独立绘图排列为网格或单行

我懂你现在的困扰——每次调用plot_course()都会生成独立的新图,结果它们全垂直堆在一起了。要把这些图排成2×2网格或者单行,核心是提前创建好子图布局,让所有绘图都在同一个画布的指定位置上进行,而不是每次都新建画布。下面给你两种实用的解决方案:

解决方案1:修改plot_course函数支持指定子图轴(推荐)

这种方法更规范,能让函数的复用性更强。我们给函数加一个ax参数,允许它接收一个子图轴对象,这样就能指定绘图的位置:

import matplotlib.pyplot as plt

def plot_course(course, ax=None):
    # 如果没传入轴对象,就用当前默认的轴
    if ax is None:
        ax = plt.gca()
    
    # 这里保留你原来的绘图逻辑,比如数据加载、绘图代码
    # 示例(替换成你的实际代码):
    # course_data = load_course_data(course)
    # ax.bar(course_data['categories'], course_data['scores'])
    
    # 基础样式设置(根据你的需求调整)
    ax.set_title(f'{course} 数据分析')
    ax.set_xlabel('指标')
    ax.set_ylabel('数值')
    ax.tick_params(axis='x', rotation=45)

接下来创建2×2的子图布局,逐个调用函数传入对应的轴:

# 创建2行2列的子图,figsize可以调整整体画布大小
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12, 8))
# 把二维的轴数组展平成一维,方便循环遍历
axes = axes.flatten()

# 要绘制的课程列表
target_courses = ['PSYCH350', 'ECON101', 'PHYSICS140', 'PHYSICS140']

# 循环给每个子图轴绘图
for course, ax in zip(target_courses, axes):
    plot_course(course, ax=ax)

# 自动调整子图间距,避免标签、标题重叠
plt.tight_layout()

# 显示或保存图
plt.show()
# plt.savefig('course_plots_2x2.png')

如果想要单行排列,只需要把subplots的参数改成nrows=1, ncols=4即可:

fig, axes = plt.subplots(nrows=1, ncols=4, figsize=(16, 4))
解决方案2:不修改原函数,手动切换子图轴

如果暂时不想改动已写好的plot_course函数,可以先创建子图布局,然后每次调用函数前用plt.sca()切换到对应的子图轴,强制函数在指定位置绘图:

import matplotlib.pyplot as plt

# 创建2×2子图布局
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
axes = axes.flatten()

target_courses = ['PSYCH350', 'ECON101', 'PHYSICS140', 'PHYSICS140']

for idx, course in enumerate(target_courses):
    # 切换到第idx个子图轴
    plt.sca(axes[idx])
    # 调用你的绘图函数
    plot_course(course)

plt.tight_layout()
plt.show()

两种方法都能解决图堆叠的问题,优先推荐第一种,因为它让函数的逻辑更清晰,后续扩展也更方便。如果你的原函数里用的是plt.plot()这类全局绘图方法,改成用ax.plot()的形式会更适配子图布局哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:57:31