多维分类柱状图需手动计算x位置并分层调用plt.bar;堆叠时须用bottom累积高度、显式设xticks和ylim(bottom=0);避免stacked=True与seaborn混用,颜色应动态生成并严格匹配层序。

用 matplotlib.pyplot.bar 画多维分类柱状图,别直接套单维写法
多维分类(比如「地区 × 季度 × 产品类型」)画柱状图,不能只调一次 plt.bar。核心是手动计算每组柱子的 x 位置,避免重叠或错位。常见错误是把不同分类维度全塞进一个 bar 调用里,结果柱子堆在同一个 x 坐标上,压根分不清谁是谁。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
np.arange生成主分类(如「地区」)的中心位置,再用width和偏移量算子分类(如「季度」)的精确x - 每个子分类用独立的
plt.bar调用,传入对应x、height和label - 务必调
plt.xticks(ticks, labels)显式设置横轴标签,否则默认刻度会丢失语义
堆叠柱状图必须用 bottom 参数累积高度,不是靠多次 bar 叠加
很多人以为堆叠就是连续画几个 bar,结果柱子上下错开、间隙大、数值对不上。真正堆叠的关键是:后一层的 bottom 必须等于前几层对应位置的高度之和。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 把数据组织成二维数组,行是类别(如「产品A/B/C」),列是分组(如「Q1/Q2」)
- 循环每一行时,维护一个
bottom数组,初始为全 0;每次画完当前行,就用bottom += current_heights - 别用
plt.bar(..., stacked=True)—— 它只支持一维输入,遇到多维分类会自动展平,失去原始分组结构
seaborn.barplot 自动处理分类但不支持真堆叠,小心 hue 和 stacked 混用
seaborn.barplot 对「主分类 + 子分类」(如地区 + 产品)很友好,x 和 hue 一配就出分组柱状图。但它没有原生堆叠能力 —— 所谓 stacked=True 是假的,实际只是并排。
常见错误现象:plt.bar(..., stacked=True) 和 seaborn.barplot(..., hue=...) 混着用,结果图里既有并排又有重叠,逻辑混乱。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 要并排对比 → 用
seaborn.barplot(x="region", y="sales", hue="product") - 要堆叠 → 老实用
matplotlib手动算bottom,或先用pandas.DataFrame.groupby(...).sum().T.plot(kind="bar", stacked=True) -
seaborn的颜色映射走palette,但堆叠时颜色顺序必须和数据层顺序严格一致,否则图例和实际堆叠层错位
颜色映射别硬编码,用 matplotlib.cm 或 seaborn.color_palette 动态生成
多维分类常有动态数量的子类(比如新增一个产品线),硬写 color=["red","blue","green"] 很容易越界或重复。更糟的是,堆叠时颜色顺序错一位,整列柱子语义就乱了。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 子类数不确定时,用
plt.cm.tab10(np.linspace(0, 1, n))或seaborn.color_palette("husl", n)生成 n 种区分度高的颜色 - 堆叠场景下,把颜色列表按数据层顺序传给每次
bar调用,确保第 i 层柱子永远用第 i 种颜色 - 别依赖默认颜色循环——
plt.bar多次调用时,颜色会自动轮换,但堆叠时你必须控制每一层的颜色,不能交给默认逻辑
最易被忽略的一点:堆叠柱状图的 y 轴必须从 0 开始,否则高度差失真;而 matplotlib 默认可能因数据范围做缩放,得显式加 plt.ylim(bottom=0)。








