如何为Pandas DataFrame的每一行数据单独绘制条形图
实现代码及说明
前置准备
首先导入需要的依赖库,同时构造你给出的示例DataFrame:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 构造示例数据 data = {'card_name': ['Diamonds', 'Clovers', 'HorseShoe'], '$20': [1000.0, 10.0, np.nan], '$25': [500.0, np.nan, 1873.0], '$30': [25, 213, 4657], '$40': [np.nan, 2199.0, np.nan], '$50': [1500.0, np.nan, 344.0], '$70': [np.nan, 43.0, 239.0], '$75': [30.0, 2.0, np.nan], '$100': [1.0, np.nan, 748.0]} df = pd.DataFrame(data)
数据格式转换
原始宽表不适合直接绘制分类条形图,先转换为长表结构,同时过滤掉无数据的NaN行:
# 宽表转长表 df_long = df.melt( id_vars='card_name', var_name='amount_level', value_name='prize_count' ) # 过滤无对应数据的空行 df_long = df_long.dropna(subset=['prize_count'])
为每个卡片单独绘制条形图
方案1:每个卡片生成独立画布
# 遍历所有卡片名称 for card in df['card_name'].unique(): # 筛选当前卡片的对应数据 card_data = df_long[df_long['card_name'] == card] # 创建画布,可自行调整尺寸 plt.figure(figsize=(10, 6)) # 绘制条形图 sns.barplot( data=card_data, x='amount_level', y='prize_count', palette='viridis' ) # 设置图表基础信息 plt.title(f'{card}卡片各金额档位奖品数量', fontsize=14) plt.xlabel('金额档位', fontsize=12) plt.ylabel('奖品数量', fontsize=12) # 条形上方添加具体数值标签 for i, v in enumerate(card_data['prize_count']): plt.text(i, v + 10, str(int(v)), ha='center', fontsize=10) plt.tight_layout() # 如需保存图片到本地,可取消注释下行,按自己需要修改存储路径 # plt.savefig(f'{card}卡片奖品数量统计.png') plt.show()
方案2:所有卡片的条形图放在同一张画布的子图中
如果需要集中对比查看,可以用子图布局实现:
cards = df['card_name'].unique() n_cards = len(cards) # 创建1行3列的子图,可自行调整尺寸 fig, axes = plt.subplots(1, n_cards, figsize=(18, 6)) for idx, card in enumerate(cards): card_data = df_long[df_long['card_name'] == card] sns.barplot( data=card_data, x='amount_level', y='prize_count', ax=axes[idx], palette='viridis' ) axes[idx].set_title(f'{card}卡片各金额档位奖品数量', fontsize=13) axes[idx].set_xlabel('金额档位', fontsize=11) axes[idx].set_ylabel('奖品数量', fontsize=11) # 添加数值标签 for i, v in enumerate(card_data['prize_count']): axes[idx].text(i, v + 10, str(int(v)), ha='center', fontsize=9) plt.tight_layout() # 如需保存图片到本地可取消注释下行 # plt.savefig('所有卡片奖品数量统计.png') plt.show()
自定义调整说明
- 所有NaN对应的空档位会自动隐藏,仅展示有数据的金额档位
- 可修改
figsize参数调整画布大小,修改palette参数更换配色方案 - 数值标签的偏移量
v + 10可以根据实际数值大小调整,避免标签超出画布或遮挡条形
内容的提问来源于stack exchange,提问作者peoplet
相关产品推荐
相关产品推荐

