我的知识记录

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*widthx ± 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 参数叠起来,而不是并排。

Python matplotlib画柱状图:分组对比柱状图实例

标签:

更新时间:2026-09-14 20:32:22

上一篇:Python matplotlib设置中文不乱码:字体配置全方案

下一篇:Python根据Excel数据画趋势图:pandas读取matplotlib出图