Matplotlib柱状图:单柱标签添加、组标签保留及图例实现方法
当然可以实现你想要的效果!我帮你整理了完整的方案,既能给单个柱子添加垂直标签、保留主分组标签,还能生成对应颜色的图例,下面是详细实现步骤和代码:
完整实现方案
1. 核心思路
- 用分组柱状图的方式绘制不同颜色的柱子(红、绿、蓝),调整柱子宽度避免重叠
- 在每个柱子底部添加垂直旋转的标签,解决重叠问题
- 将主分组标签(A、B、C、D)设置在每组柱子的中心位置
- 通过自定义图例元素匹配柱子颜色和标签
2. 完整代码实现
import matplotlib.pyplot as plt import numpy as np from matplotlib.patches import Patch # 创建画布和坐标轴 fig = plt.figure(figsize=(10, 6)) ax = fig.add_subplot(111) # 配置基本参数 n_groups = 4 bar_width = 0.25 # 调整宽度让三组柱子在一个分组内不重叠 opacity = 0.7 index = np.arange(n_groups) # 主分组的x轴位置 # 模拟每组的三个柱子数据(你可以替换成自己的真实数据) red_data = [10, 12, 15, 8] green_data = [8, 10, 12, 9] blue_data = [12, 9, 11, 14] # 绘制三组不同颜色的柱状图 red_bars = ax.bar(index - bar_width, red_data, bar_width, alpha=opacity, color='red') green_bars = ax.bar(index, green_data, bar_width, alpha=opacity, color='green') blue_bars = ax.bar(index + bar_width, blue_data, bar_width, alpha=opacity, color='blue') # 定义函数:为单个柱子添加垂直标签(位于柱子下方) def add_individual_bar_labels(bars, label_text): for bar in bars: # 计算标签的位置:柱子底部中心,y轴位置设为-1.5(可根据你的数据范围调整) x_pos = bar.get_x() + bar.get_width() / 2 y_pos = -1.5 ax.text(x_pos, y_pos, label_text, ha='center', va='top', rotation=90, fontsize=10) # 给三组柱子分别添加标签 add_individual_bar_labels(red_bars, 'red') add_individual_bar_labels(green_bars, 'green') add_individual_bar_labels(blue_bars, 'blue') # 设置主分组的x轴标签(A、B、C、D) ax.set_xticks(index) ax.set_xticklabels(['A', 'B', 'C', 'D'], fontsize=12) # 调整y轴范围,避免底部标签被截断 max_value = max(max(red_data), max(green_data), max(blue_data)) ax.set_ylim(0, max_value + 2) # 创建并添加颜色图例 legend_elements = [ Patch(facecolor='red', alpha=opacity, label='red'), Patch(facecolor='green', alpha=opacity, label='green'), Patch(facecolor='blue', alpha=opacity, label='blue') ] ax.legend(handles=legend_elements, loc='upper right') # 添加标题和轴标签 ax.set_ylabel('Value', fontsize=11) ax.set_title('Grouped Bars with Individual Vertical Labels', fontsize=13) # 自动调整布局,避免元素重叠 plt.tight_layout() plt.show()
3. 关键细节说明
- 柱子宽度调整:用
bar_width=0.25让三组柱子在一个主分组内紧凑排列,不会互相重叠 - 垂直标签位置:通过
rotation=90设置垂直显示,y_pos=-1.5把标签放在柱子下方,你可以根据自己的数据范围调整这个值 - 主分组标签:
ax.set_xticks(index)把刻度放在每组柱子的中心,完美对应A/B/C/D标签 - 图例创建:用
Patch对象手动创建图例元素,确保颜色和标签与柱子完全匹配
内容的提问来源于stack exchange,提问作者infoclogged
相关产品推荐
相关产品推荐

