4.2 ggplot2图形语法:图层叠加出真相


4.2 ggplot2 图形语法:图层叠加出真相

本节摘要: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 是两张最常用的定稿脸面;报告里所有图共用一个主题与同一套轴标签风格,是"像一份正式案卷"的最低配置。

本节要点回顾

  • 加号即图层:ggplot 底图加 geom 层层叠加
  • aes 放变量、参数外放常量:映射与固定的分界线
  • 换 geom 换图型:同一底图,point 换 smooth 即趋势
  • facet_wrap 拆混杂:类别变量各占一面,错觉无处藏身
  • labs 与 theme 收尾:进报告的图必须有可读的标题与轴标
  • coord_cartesian 只缩放不裁数据:放大局部别用 ylim 误删证据
  • ggsave 定尺寸:导出时声明宽高与 dpi,别靠事后拉伸

最后把两套系统放到同一张表里收束本章主线:基础绘图一条命令出图、参数管外观;图形语法把图拆成数据、映射、几何、标度、分面五件成分,改成分即改视角。快审用前者,定稿与多维推理用后者——本案从"两撮点"到"分组趋势各自成立"的全过程,就是图形语法推理力的完整展示。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U