什么时候用它
柱状图比较离散类别对应的数值。类别之间没有连续过程,柱与柱之间的空隙正是在表达这一点;如果横轴是日期、年龄或剂量,通常应先考虑折线或点图。
一根柱最适合回答“谁高、谁低、差多少”。加入第二个分类后有两条不同路线:
- 并排柱保留共同零基线,适合比较各组绝对值。
- 堆叠柱把各部分加成总量,适合看构成;只有最底层拥有共同基线,中间区块不适合精确比较。
柱图不是连续数据分布的替代品。每组有很多原始观测时,只画均值柱会藏掉离散程度、样本量和异常值;应优先用点图、箱线图、小提琴图或点估计加误差棒。
geom_bar() 还是 geom_col()
两者的区别不在外观,而在谁负责计算柱高:
geom_bar()默认stat = "count",输入是一行一个观测的原始类别,它替你数行数。geom_col()等价于geom_bar(stat = "identity"),输入已经有y,柱高就是数据里的值。
hair_eye_color 的 Freq 已经是频数。若直接写 geom_bar(),R 数到的是每种组合有几行,而不是学生人数;图可以正常生成,含义却完全错了。因此第一种用 mtcars 演示原始行计数,后面的汇总表全部使用 geom_col()。
频数表也可以写 geom_bar(aes(weight = Freq)),此时统计层会按类别累加权重。这在临时探索时很方便,但正式 Recipe 更倾向先把汇总表算出来再用 geom_col():中间数据可以检查、复用,缺组也更容易发现。
怎么读
- 先确认零基线。 柱长依靠长度编码,截断纵轴会夸大差异。
- 比较柱端位置。 单柱和并排柱共享基线,柱端越容易对齐,比较越可靠。
- 堆叠图先看总长。 整根柱回答总量,各区块回答组成。
- 中间区块只作粗略比较。 它们上下边界都在移动,没有共同起点。
- 百分比柱只表达构成。 每根都是 100%,看不出样本量大小;必要时另画总量或在图注中给出
n。
常见陷阱
- 用
geom_bar()重数汇总表。 一行代表 68 人时,它仍只数成 1。 - 柱轴不从零开始。 长度编码失去共同起点,视觉差异会被人为放大。
- 擅自排序。 名义类别可按数值排序;时间、剂量、流程阶段和有自然顺序的等级不能为了好看重排。
- 分组太多。 每组四五根并排柱以后,读者既找不到配对,也读不动图例;改用分面、点图或热图。
- 堆叠顺序与图例相反。 每次查颜色都要在脑中翻转顺序。
- 100% 掩盖缺组。 少一类后剩余部分仍会归一化成 100%;必须在归一化之前检查组合是否完整。
- 每段都塞标签。 小区块放不下文字时应省略,让 tooltip、图例或表格承担精确读数。
- 均值柱冒充原始数据。 没有误差、样本量与分布的均值柱,往往比不画更容易误导。
配色
柱子的 fill 表达类别,因此使用定性色板 walter_white2。单序列只需一个颜色;并排或堆叠时,每个水平固定使用一个颜色,图例顺序必须与分组或堆叠顺序一致。
相邻色块比相隔的散点更考验颜色边界。堆叠柱使用细白线分隔区块,但白线只负责断开边界,不能补救本身难以区分的配色。色板少于类别数时,不应循环颜色;应减少重点类别、合并有业务意义的类别,或明确将其余类别作为中性上下文。





