Python分组柱形图绘制全攻略
一、代码分析
1. 数据准备层
categories = ['Q1', 'Q2', 'Q3', 'Q4'] # X轴离散类别
sales_A = [23, 45, 12, 67] # 系列A数据
sales_B = [34, 30, 53, 28] # 系列B数据
关键点:数据必须为数值型列表/数组,类别与数据长度一致
2. 图表构建层
width = 0.35 # 柱宽控制分组间距
x = np.arange(len(categories)) # 生成0,1,2,3作为基准坐标
3. 绘图核心
rects1 = ax.bar(x - width/2, sales_A, width, label='产品A', ...)
rects2 = ax.bar(x + width/2, sales_B, width, label='产品B', ...)
参数解析:
edgecolor
:柱体边框色(增强辨识度)color
:使用十六进制色彩代码(专业设计规范)
4. 专业美化层
ax.grid(axis='y', linestyle='--', alpha=0.7) # 仅显示y轴网格线
ax.legend(title='产品线') # 图例标题提升可读性
设计原则:避免视觉干扰(如x轴网格线)
5. 数据标注
ax.annotate(f'{height}', xytext=(0, 3), ha='center', va='bottom')
交互设计:3像素垂直偏移避免文字重叠
二、柱形图通用编写模板
import matplotlib.pyplot as plt
import numpy as npdef create_grouped_bar_chart(data_dict, title="", xlabel="", ylabel=""):"""Parameters:data_dict: {'系列1': [值1,值2...], '系列2': [...]} """# 1. 数据准备categories = list(data_dict.keys())values = list(data_dict.values())n_series = len(values)# 2. 计算布局width = 0.8 / n_series # 动态柱宽x = np.arange(len(values[0])) # 基准坐标# 3. 创建图表fig, ax = plt.subplots(figsize=(10, 6))# 4. 绘制柱形组colors = plt.cm.tab10.colors # 使用专业配色for i in range(n_series):offset = width * (i - n_series/2 + 0.5)rects = ax.bar(x + offset, values[i], width, label=categories[i], color=colors[i],edgecolor='white')# 自动标注for rect in rects:height = rect.get_height()ax.annotate(f'{height:.1f}',xy=(rect.get_x() + rect.get_width()/2, height),xytext=(0, 3),textcoords="offset points",ha='center', va='bottom')# 5. 专业美化ax.set_title(title, pad=20, fontsize=14)ax.set_xlabel(xlabel)ax.set_ylabel(ylabel)ax.set_xticks(x)ax.set_xticklabels([f'Q{i+1}' for i in range(len(x))])ax.legend(title="数据系列", frameon=False)ax.grid(axis='y', linestyle=':', alpha=0.4)plt.tight_layout()return fig, ax# 使用示例
data = {'北京': [45, 32, 56, 71],'上海': [51, 28, 63, 59],'广州': [38, 41, 49, 62]
}
create_grouped_bar_chart(data, title="三大城市季度销售对比")
plt.show()
三、关键设计原则
1. 布局规范
元素 | 推荐参数 | 作用 |
---|---|---|
画布大小 | figsize=(10,6) | 保持黄金分割比例 |
柱体间距 | width=0.8/n_series | 动态适应系列数量 |
颜色方案 | plt.cm.tab10 | 专业配色且色盲友好 |
2. 交互增强技巧
# 添加悬停效果(需配合Jupyter)
def hover(event):if event.inaxes == ax:for rect in rects1 + rects2:if rect.contains(event)[0]:rect.set_alpha(0.5)fig.canvas.draw_idle()
fig.canvas.mpl_connect("motion_notify_event", hover)
3. 性能优化
# 大数据集优化(>10万条)
ax.bar(x, data, width, rasterized=True) # 启用栅格化
plt.savefig('output.pdf', dpi=300) # 矢量图输出
四、常见变体实现
1. 堆叠柱形图
bottom = np.zeros(len(categories))
for i, (label, values) in enumerate(data_dict.items()):ax.bar(x, values, width, label=label, bottom=bottom,color=colors[i])bottom += values # 累加底部位置
2. 百分比柱形图
total = np.sum(values, axis=0)
percent = values / total * 100
ax.bar(x, percent, ...)
ax.set_ylabel("占比(%)")
3. 双向柱形图
ax.barh(x, positive_data, label='正向')
ax.barh(x, negative_data, label='负向', left=-negative_data)
五、调试指南
柱体错位:检查
x ± offset
计算逻辑文字重叠:调整
xytext
偏移量或旋转标签颜色混淆:使用色盲友好配色(
viridis
/plasma
)性能卡顿:对大数据集使用
rasterized=True