本节摘要:ggplot2 的核心思想是把图拆成语法成分——数据、映射、几何对象、标度、分面,用加号层层叠加。本节用图形语法重画油耗案的散点图,把第 1 节发现的"两撮点"拆开,钉死"驱动方式才是幕后推手"的结论。
library(ggplot2) ggplot(mpg, aes(x = displ, y = hwy, color = drv)) + geom_point(size = 2, alpha = 0.7) + labs(title = "排量与高速油耗:颜色即驱动方式", x = "排量(升)", y = "高速油耗(英里每加仑)")
读法:ggplot() 铺底并声明数据与映射(aes 里放"哪个变量扮演什么角色"),geom_point() 叠加一层点,labs() 管标签。换一个 geom 就是另一种图——同一底图,套 geom_smooth 就加趋势线:
ggplot(mpg, aes(x = displ, y = hwy)) + geom_point(alpha = 0.5) + geom_smooth(method = "lm", se = TRUE) # 线性趋势带置信带
第 1 节散点图里同一排量上下两撮点的疑团,一个 facet_wrap 拆解:
ggplot(mpg, aes(x = displ, y = hwy)) + geom_point() + facet_wrap(~ drv, nrow = 1) # 每种驱动方式各得一面
分成"四轮、前轮、后轮"三面后真相大白:四轮驱动车型集中在低油耗带,前驱车型在高油耗带——所谓"大排量反而省油"的错觉,是混杂变量驱动方式制造的。每一面内排量与油耗的关系都是清晰的负向。
| 成分 | 函数 | 职责 |
|---|---|---|
| 数据与映射 | ggplot 加 aes | 变量到图形角色的指派 |
| 几何对象 | geom_xxx | 点、线、面、柱、箱 |
| 标度 | scale_xxx | 颜色、坐标轴的映射规则 |
| 分面 | facet_wrap / facet_grid | 按类别拆成小图阵 |
| 主题 | theme_minimal 等 | 非数据性的外观 |

⚠️ 常见坑:aes 内放常量(如 color = "red")会把它当成只有一个水平的变量,图例里出现一个多余的红色项。颜色常量写在 aes 外面:
geom_point(color = "red")。
分面之外,标度层是图形语法的第二台推理引擎。三段实用操作:
# 手动指定颜色:类别有业务含义时,配色不能交给默认 ggplot(mpg, aes(displ, hwy, color = drv)) + geom_point() + scale_color_manual(values = c("四轮" = "gray40", "前轮" = "steelblue", "后轮" = "tomato")) # 坐标翻转:类别名太长横放更好读 ggplot(mpg, aes(class, hwy)) + geom_boxplot() + coord_flip() # 双轴与比例坐标:柱状图要"从零起步",否则高度失去比例含义 ggplot(mpg, aes(class)) + geom_bar() + coord_cartesian(ylim = c(0, 70)) # 明确 y 从 0 起且不裁剪数据
coord_cartesian 与 ylim 的区别值得一记:前者只缩放视野、不动数据,后者会把视野外的点当缺失剔除——画散点要放大局部时用前者,别误删证据。
geom 自带统计变换(stat),很多"高级图"其实只是一行参数:
# 直方图配密度曲线:两图层共享 x,统计量各算各的 ggplot(mpg, aes(cty)) + geom_histogram(aes(y = after_stat(density)), bins = 20, fill = "grey85") + geom_density(linewidth = 1) # 回归按组各配一条:分面之外的另一招拆混杂 ggplot(mpg, aes(displ, hwy, color = drv)) + geom_point(alpha = 0.5) + geom_smooth(method = "lm", se = FALSE) # 判读:三条斜率同为负的直线——组内"排量大更费油"重新成立
第二段是本案的点睛之笔:不分组的总趋势线会被混杂拉弯,分组后每组各自成立"排量升、油耗降(每加仑里程降)"。图形语法让"按组检验"只是一个 color 参数的事——这正是它相对基础绘图的本质优势:视角的切换被语法化了。
进报告的图要统一外观并按尺寸导出:
p <- ggplot(mpg, aes(displ, hwy, color = drv)) + geom_point() + geom_smooth(method = "lm", se = FALSE) + theme_minimal(base_size = 13) ggsave("oil_final.png", p, width = 7, height = 4.5, dpi = 300) # 尺寸在保存时指定,比事后拉伸不糊;dpi 300 是印刷惯例
theme_minimal 与 theme_classic 是两张最常用的定稿脸面;报告里所有图共用一个主题与同一套轴标签风格,是"像一份正式案卷"的最低配置。
最后把两套系统放到同一张表里收束本章主线:基础绘图一条命令出图、参数管外观;图形语法把图拆成数据、映射、几何、标度、分面五件成分,改成分即改视角。快审用前者,定稿与多维推理用后者——本案从"两撮点"到"分组趋势各自成立"的全过程,就是图形语法推理力的完整展示。