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()
代码细节解释
- 数据补全:用
ffill()方法自动填充Mon列的缺失值,确保每一行都有对应的月份信息,避免后续绘图时出现数据错位。 - 分组筛选:通过
unique()获取所有类别,循环处理每个类别的数据,保证每个图表只对应单一Category。 - 绘图优化:
- 将月份和年份组合成y轴标签,让图表信息更直观;
- 每个类别单独创建画布,避免多个图表重叠混乱;
tight_layout()自动调整图表元素位置,防止y轴长标签被截断。
如果想把所有类别放在同一个画布的子图中对比,也可以修改代码用plt.subplots()创建子图网格(比如3行1列),这样能同时查看所有类别的数据分布。
内容的提问来源于stack exchange,提问作者PineNuts0
相关产品推荐
相关产品推荐

