Matplotlib同画布绘制四个堆叠条形子图并导出PDF的问题求助
问题排查与解决方案
你的代码无法运行的核心问题是对子图Axes对象和pandas绘图方法的配合使用理解有误:ax1.df.plot()这种写法是错误的,ax1是Matplotlib的Axes子图对象,它本身并没有df这个属性。正确的做法是在pandas的plot()方法中,通过ax参数指定要将图形绘制到哪个子图Axes上。
修正后的完整代码
下面是可以正常运行的代码,我保留了你原本的subplot2grid布局逻辑,只修正了绘图的调用方式:
import pandas as pd import numpy as np pd.set_option('max_columns', None) import matplotlib.pyplot as plt data = { 'type_sale': ['group_1','group_2','group_3','group_4','group_5','group_6','group_7','group_8','group_9','group_10'], 'open':[70,20,24,80,20,20,60,20,20,20], 'closed':[30,14,20,10,10,40,10,10,10,10], } df = pd.DataFrame(data, columns = ['type_sale', 'open', 'closed', ]) # 设置subplot2grid布局 fig = plt.figure(figsize=(12, 8)) # 指定画布大小,避免子图拥挤 # 子图1 ax1 = plt.subplot2grid((2,2), (0,0)) df.plot(x='type_sale', kind='bar', stacked=True, title='Stacked Bar Graph 1', ax=ax1) # 子图2 ax2 = plt.subplot2grid((2,2), (1,0)) df.plot(x='type_sale', kind='bar', stacked=True, title='Stacked Bar Graph 2', ax=ax2) # 子图3 ax3 = plt.subplot2grid((2,2), (0,1)) df.plot(x='type_sale', kind='bar', stacked=True, title='Stacked Bar Graph 3', ax=ax3) # 子图4 ax4 = plt.subplot2grid((2,2), (1,1)) df.plot(x='type_sale', kind='bar', stacked=True, title='Stacked Bar Graph 4', ax=ax4) fig.tight_layout() plt.savefig('stacked_bars.pdf') # 保存为PDF格式 plt.show()
关键修改点说明
- 把
ax1.df.plot()改成df.plot(..., ax=ax1):通过ax参数告诉pandas要把堆叠条形图绘制到指定的子图Axes上。 - 给每个子图设置了不同标题(可选),方便区分;你也可以保持原标题不变。
- 增加
figsize参数设置画布大小,让子图显示更清晰(可选但推荐)。
更简洁的写法(循环生成子图)
如果不想重复写四次绘图代码,可以用循环生成子图,让代码更简洁:
import pandas as pd import numpy as np pd.set_option('max_columns', None) import matplotlib.pyplot as plt data = { 'type_sale': ['group_1','group_2','group_3','group_4','group_5','group_6','group_7','group_8','group_9','group_10'], 'open':[70,20,24,80,20,20,60,20,20,20], 'closed':[30,14,20,10,10,40,10,10,10,10], } df = pd.DataFrame(data, columns = ['type_sale', 'open', 'closed', ]) fig = plt.figure(figsize=(12, 8)) # 遍历2x2的子图位置 for i in range(2): for j in range(2): ax = plt.subplot2grid((2,2), (i,j)) df.plot(x='type_sale', kind='bar', stacked=True, title=f'Stacked Bar Graph {i*2 + j +1}', ax=ax) fig.tight_layout() plt.savefig('stacked_bars.pdf') plt.show()
运行后就能得到四个完全相同的堆叠条形子图,并且成功保存为PDF文件了。
内容的提问来源于stack exchange,提问作者silent_hunter




