如何使用Matplotlib创建分组柱状图(grouped bar plot)并处理CSV数据
实现带自定义分组和标注的普通柱状图
下面是基于Pandas和Matplotlib的完整解决方案,适配自定义分组、CSV数据导入和数值标注需求,直接替换你的数据路径即可运行:
1. 依赖库导入
import pandas as pd import matplotlib.pyplot as plt import numpy as np
2. 数据读取与自定义分组
假设你的CSV数据包含类别和数值列,我们手动添加自定义分组(如果CSV已有分组列,可跳过分组映射步骤):
# 替换为你的CSV文件路径 df = pd.read_csv("your_data.csv") # 自定义分组规则,根据你的实际类别修改 group_mapping = { "产品X": "电子产品", "产品Y": "电子产品", "产品A": "家居用品", "产品B": "家居用品", "产品M": "办公耗材" } # 新增分组列 df["分组"] = df["类别"].map(group_mapping)
3. 绘制分组柱状图并添加标注
# 按分组排序,保证同组类别相邻 df = df.sort_values("分组") # 获取唯一分组和类别列表 unique_groups = df["分组"].unique() unique_cats = df["类别"].unique() # 设置柱子宽度和分组间距 bar_width = 0.35 group_gap = 0.6 # 计算每个分组的起始坐标 group_coords = np.arange(len(unique_groups)) * (len(unique_cats)/len(unique_groups) + group_gap) # 计算每个类别的具体坐标 cat_coords = np.concatenate([group_coord + np.arange(len(df[df["分组"] == g])) for group_coord, g in zip(group_coords, unique_groups)]) # 创建画布 plt.figure(figsize=(12, 7)) # 按分组循环绘制柱子,并添加标注 group_colors = ["#2E86AB", "#F24C4C", "#F7D060"] for idx, group in enumerate(unique_groups): group_data = df[df["分组"] == group] # 计算当前分组内柱子的坐标 current_coords = group_coords[idx] + np.arange(len(group_data)) # 绘制柱状图 bars = plt.bar(current_coords, group_data["数值"], width=bar_width, label=group, color=group_colors[idx]) # 给每个柱子添加数值标注 for bar in bars: bar_height = bar.get_height() plt.text(bar.get_x() + bar.get_width()/2, bar_height + (bar_height*0.02), f"{bar_height:.1f}", # 可调整小数位数 ha="center", va="bottom", fontsize=10) # 设置x轴标签 plt.xticks(cat_coords, df["类别"], rotation=45, ha="right", fontsize=10) # 添加图表元素 plt.legend(title="自定义分组", bbox_to_anchor=(1.01, 1), loc="upper left") plt.title("分组柱状图(带数值标注)", fontsize=14) plt.xlabel("类别", fontsize=12) plt.ylabel("数值", fontsize=12) # 调整布局,避免标签被截断 plt.tight_layout() plt.show()
关键说明
- 适配CSV数据:确保你的CSV列名和代码中的
类别、数值对应,若列名不同,直接替换代码中的列名即可 - 分组逻辑:如果你的CSV已经包含分组信息,直接使用现有
分组列即可,无需手动映射 - 标注调整:可修改
f"{bar_height:.1f}"中的小数位数,或调整bar_height + (bar_height*0.02)来改变标注的垂直位置 - 样式自定义:可替换
group_colors中的十六进制颜色值,或调整figsize、bar_width等参数优化图表外观
内容的提问来源于stack exchange,提问作者Zon Zahidan
相关产品推荐
相关产品推荐

