如何用pandas dataframe.plot从长数据绘制分组柱状图
用pandas DataFrame.plot实现长格式数据的分组柱状图
没问题!要替代Seaborn的sns.barplot实现你要的分组柱状图,核心是先把长格式数据转换为宽格式——因为pandas的plot方法默认是按列来生成分组柱子的,而你当前的grouped_dataframe是长格式(每行对应一个日期+交易类型的组合)。
步骤1:将长格式数据转为宽格式
用pivot方法来重塑数据,把Transaction type转成列,Date作为索引,Amount (EUR)作为值:
# 转换为宽格式 wide_df = grouped_dataframe.pivot( index='Date', columns='Transaction type', values='Amount (EUR)' )
如果你的数据存在某个日期缺少某类交易的情况(会出现NaN),可以用pivot_table并指定fill_value=0来填充缺失值:
wide_df = grouped_dataframe.pivot_table( index='Date', columns='Transaction type', values='Amount (EUR)', aggfunc='sum', # 因已完成分组求和,此聚合逻辑不影响结果,仅确保数据完整性 fill_value=0 )
步骤2:生成分组柱状图
现在直接调用plot.bar()就能得到和Seaborn效果一致的分组柱状图,还可以按需调整样式(包括指定你之前用到的ax1):
import matplotlib.pyplot as plt # 生成柱状图,绑定到指定的ax对象 ax = wide_df.plot(kind='bar', figsize=(12, 6), ax=ax1) # 调整图表标签与标题 ax.set_ylabel('Amount (EUR)') ax.set_title('Monthly Transaction Amounts by Type') # 优化图例位置,避免遮挡图表内容 ax.legend(title='Transaction type', bbox_to_anchor=(1.05, 1), loc='upper left') # 自动调整布局,防止轴标签被截断 plt.tight_layout() plt.show()
为什么这样可行?
转换后的宽格式数据结构会变成类似这样:
| Date | Cash26取款 | 直接借记 | 收入 | 万事达卡支付 | 转出 |
|---|---|---|---|---|---|
| 2020-02-29 | -400.00 | -73.86 | 35530.0 | -862.01 | -32415.0 |
| ... | ... | ... | ... | ... | ... |
此时pandas会把每一列作为一个分组,在每个x轴(Date)位置上并列显示对应列的柱子,完美对应你之前用Seaborn hue参数实现的分组效果。
内容的提问来源于stack exchange,提问作者Andrew Holway
相关产品推荐
相关产品推荐

