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
相关产品推荐
相关产品推荐

