You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动