如何使用matplotlib创建同组同色、柱带标签无图例的分组柱状图
Matplotlib 分组柱状图自定义实现方案
针对「同分组柱体同色、移除默认图例、柱体添加数值标签」的需求,可直接通过以下代码实现:
import matplotlib.pyplot as plt import pandas as pd # 构造源数据 df = pd.DataFrame([['A', 10, 20, 10, 30], ['B', 20, 25, 15, 25], ['C', 12, 15, 19, 6], ['D', 10, 29, 13, 19]], columns=['Team', 'Round 1', 'Round 2', 'Round 3', 'Round 4']) # 为每个Team配置统一展示颜色 team_colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728'] bar_per_team = len(df.columns) - 1 # 每个Team对应的柱体数,即轮次数量 # 绘制基础分组柱图,直接关闭默认图例 ax = df.plot( x='Team', kind='bar', stacked=False, title='Grouped Bar Graph with unified team color', legend=False, figsize=(8, 5) ) # 批量设置柱体颜色+添加数值标签 for bar_idx, bar in enumerate(ax.patches): # 按每bar_per_team个柱为一个Team分组,匹配对应颜色 current_team = bar_idx // bar_per_team bar.set_color(team_colors[current_team]) # 柱顶添加数值标签 height = bar.get_height() ax.text( bar.get_x() + bar.get_width()/2, height + 0.4, f"{height}", ha='center', va='bottom' ) # 调整布局避免元素截断 plt.tight_layout() plt.show()
核心实现逻辑
- 同组同色:pandas 生成的非堆叠分组柱状图,柱体排列顺序为「所有Team的第1轮柱→所有Team的第2轮柱→...→最后一轮柱」,因此每
bar_per_team个柱属于同一Team,按索引切片分组赋色即可。 - 移除图例:调用
df.plot()时传入legend=False参数,可直接关闭默认生成的多色图例,无需后续手动删除。 - 数值标签:遍历轴内所有柱形patch,获取每个柱的水平居中位置、顶部高度,在柱顶上方少量偏移位置添加数值文本,偏移量可根据数据量级自行调整避免重叠。
内容的提问来源于stack exchange,提问作者Gerald Vasquez Aleman
相关产品推荐
相关产品推荐

