You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:06:04