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

Python:为Pandas DataFrame中每个不同类别创建独立水平条形图

为每个Category创建独立水平条形图的解决方案

看起来你需要为DataFrame里的每个Category(A/B/C)分别生成水平条形图,不过首先得先把你的数据整理好——原始数据里Mon列只有每组的第一行有值,后续年份行的Mon是空的,得先填充这个缺失值,不然没法正确对应月份和年份。

下面是完整的实现步骤和代码:

步骤1:数据预处理

首先我们要把Mon列的缺失值填充,让每个年份行都对应正确的月份。可以用ffill()(向前填充)来实现,因为每个月份的年份行都是跟在有月份标识的行后面的。

步骤2:分组并绘制水平条形图

我们可以用pandas的分组功能,对每个Category单独处理,然后用matplotlib绘制水平条形图,每个Category的图可以单独展示或者放在子图里。

完整代码示例

import pandas as pd
import matplotlib.pyplot as plt

# 构造你的原始数据(补全省略的部分示例值)
data = [
    ["Jan", 2016, 0.024454035, "A"],
    [None, 2017, 0.048216976, "A"],
    [None, 2018, 0.064599633, "A"],
    ["Feb", 2016, 0.039955399, "A"],
    [None, 2017, 0.038249422, "A"],
    [None, 2018, 0.040955116, "A"],
    ["Mar", 2016, 0.047335373, "A"],
    [None, 2017, 0.095655431, "A"],
    [None, 2018, 0.018486543, "A"],
    ["Jan", 2016, 0.014454035, "B"],
    [None, 2017, 0.018216976, "B"],
    [None, 2018, 0.064599633, "B"],
    ["Feb", 2016, 0.039955399, "B"],
    [None, 2017, 0.083824942, "B"],
    [None, 2018, 0.080955116, "B"],
    ["Mar", 2016, 0.047335373, "B"],
    [None, 2017, 0.035655431, "B"],
    [None, 2018, 0.078486543, "B"],
    ["Jan", 2016, 0.024454035, "C"],
    [None, 2017, 0.018216976, "C"],
    [None, 2018, 0.024599633, "C"],
    ["Feb", 2016, 0.031955399, "C"],
    [None, 2017, 0.028249422, "C"],
    [None, 2018, 0.030955116, "C"]
]

df = pd.DataFrame(data, columns=["Mon", "Year", "Ratio", "Category"])

# 填充Mon列的缺失值,向前填充
df["Mon"] = df["Mon"].ffill()

# 获取所有唯一的Category
categories = df["Category"].unique()

# 为每个Category创建独立的图
for cat in categories:
    # 筛选当前Category的数据
    cat_df = df[df["Category"] == cat]
    # 创建画布
    plt.figure(figsize=(8, 6))
    # 生成y轴标签:组合月份和年份
    y_labels = [f"{row['Mon']} {row['Year']}" for _, row in cat_df.iterrows()]
    # 绘制水平条形图
    plt.barh(y_labels, cat_df["Ratio"], color="#1f77b4")
    # 设置图表标题和标签
    plt.title(f"Horizontal Bar Chart for Category {cat}")
    plt.xlabel("Ratio Value")
    plt.ylabel("Month-Year")
    # 调整布局防止标签被截断
    plt.tight_layout()
    # 展示图表(如需保存可替换为plt.savefig(f"category_{cat}_bar.png"))
    plt.show()

代码细节解释

  1. 数据补全:用ffill()方法自动填充Mon列的缺失值,确保每一行都有对应的月份信息,避免后续绘图时出现数据错位。
  2. 分组筛选:通过unique()获取所有类别,循环处理每个类别的数据,保证每个图表只对应单一Category。
  3. 绘图优化:
    • 将月份和年份组合成y轴标签,让图表信息更直观;
    • 每个类别单独创建画布,避免多个图表重叠混乱;
    • tight_layout()自动调整图表元素位置,防止y轴长标签被截断。

如果想把所有类别放在同一个画布的子图中对比,也可以修改代码用plt.subplots()创建子图网格(比如3行1列),这样能同时查看所有类别的数据分布。

内容的提问来源于stack exchange,提问作者PineNuts0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:23:25