Python matplotlib画柱状图:分组对比柱状图实例
用Python matplotlib画柱状图,涵盖单组柱状图和分组对比柱状图,含中文配置、数值标签、颜色区分和高清保存,代码可直接运行。
场景痛点
每个月都要对比各部门、各产品的指标完成情况,Excel里插柱状图要手动选数据、拉颜色、调间距。数据更新一次就得重做一次,多个系列并排时还经常把柱子叠在一起。用matplotlib写脚本,数据换了重新跑一遍就出图,分组宽度、颜色、标签全部代码控制。
用到的库
pip install matplotlib pandas
完整代码
# 导入绘图库
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
# 解决中文乱码
matplotlib.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei", "Arial Unicode MS"]
matplotlib.rcParams["axes.unicode_minus"] = False
def draw_grouped_bar():
# 三个产品在四个季度的销量
products = ["产品A", "产品B", "产品C"]
q1 = [230, 180, 260]
q2 = [250, 210, 240]
q3 = [300, 260, 280]
q4 = [280, 300, 310]
x = np.arange(len(products)) # 柱子位置
width = 0.2 # 每组中每根柱子的宽度
plt.figure(figsize=(10, 6))
# 四组柱子依次错位
plt.bar(x - 1.5 * width, q1, width, label="第一季度")
plt.bar(x - 0.5 * width, q2, width, label="第二季度")
plt.bar(x + 0.5 * width, q3, width, label="第三季度")
plt.bar(x + 1.5 * width, q4, width, label="第四季度")
# 在每根柱子上方标数值
for i, v in enumerate(q1):
plt.text(x[i] - 1.5 * width, v + 5, str(v), ha="center", fontsize=9)
for i, v in enumerate(q2):
plt.text(x[i] - 0.5 * width, v + 5, str(v), ha="center", fontsize=9)
for i, v in enumerate(q3):
plt.text(x[i] + 0.5 * width, v + 5, str(v), ha="center", fontsize=9)
for i, v in enumerate(q4):
plt.text(x[i] + 1.5 * width, v + 5, str(v), ha="center", fontsize=9)
plt.title("各产品季度销量对比", fontsize=16)
plt.xlabel("产品", fontsize=12)
plt.ylabel("销量(件)", fontsize=12)
plt.xticks(x, products)
plt.legend()
plt.ylim(0, 380)
plt.tight_layout()
plt.savefig("grouped_bar.png", dpi=150)
plt.close()
print("分组柱状图已保存为 grouped_bar.png")
if __name__ == "__main__":
draw_grouped_bar()
代码讲解
np.arange(len(products))生成每个产品组的中心横坐标,作为柱子对齐基准。- 四组柱子通过
x ± 1.5*width和x ± 0.5*width左右偏移,形成并排效果,不会重叠。 plt.text()在柱子顶部加数值标签,ha="center"水平居中,v + 5是在柱顶上方留出5个单位的空隙。plt.xticks(x, products)把横坐标刻度替换成产品名,ylim给顶部标签留出空间。
运行结果
当前目录生成 grouped_bar.png,图中每个产品下方并排四根不同颜色的季度柱子,柱顶标注具体数值,带图例和标题。打开图片确认三组产品、四季度数据齐全。
注意事项
- 分组柱数超过4组时,
width要相应调小,否则柱子会挤在一起或超出画布。 - 柱顶文字偏移量
v + 5要根据数据量级调整,数据是百万级时改成v * 1.02更稳妥。 - 想做堆叠柱状图就把多组数据用
bottom参数叠起来,而不是并排。

更新时间:2026-09-14 20:32:22
上一篇:Python matplotlib设置中文不乱码:字体配置全方案