现代统计图形(第二版)

作者

黄湘云

发布日期

2024年6月21日

欢迎

注意

本书是《现代统计图形》(赵鹏, 谢益辉, 和 黄湘云 2021) 的后续第二版,尚处于草创阶段。

书中的代码字体采用美观的 Source Code Pro 字体, 为方便跨操作系统编译书籍电子版,正文的中文字体采用开源的 fandol 字体。 而本书图形中使用的 Noto 系列中英文字体来自 Google Fonts 字体库,分别是 Noto Sans 无衬线英文字体和 Noto Serif SC 宋体中文字体。 图 1 中的左、右子图分别展示 Base R 和 ggplot2 (Wickham 2016) 图形中中英文字体的效果。在图形中调用中文字体分两步走,先使用 sysfonts 包获取并注册 Noto 相关字体,然后在绘图的时候指定字体,并在代码块选项中启用 fig.showtext = TRUE,这样就能在 R Markdown 环境中优雅地绘制含中文的图形。如果在 R Console 中绘图则需加载 showtext 包,运行函数 showtext_auto()

代码
# 准备 Noto 中英文字体
# sysfonts::font_add_google(name = "Noto Sans", family = "Noto Sans")
# sysfonts::font_add_google(name = "Noto Serif SC", family = "Noto Serif CJK SC")
# 在 Base R 图形中使用 Noto 字体
plot(pressure, type = "b", pch = 19, ann = FALSE, family = "Noto Sans")
title(xlab = "温度", ylab = "压力", family = "Noto Serif CJK SC")
# 在 ggplot2 图形中使用 Noto 字体
library(ggplot2)
ggplot(data = pressure, aes(x = temperature, y = pressure)) +
  geom_line() +
  geom_point(size = 2) +
  labs(x = "温度", y = "压力") +
  scale_x_continuous(breaks = seq(0, 400, by = 50)) +
  theme_bw(base_size = 13) +
  theme(
    axis.title = element_text(family = "Noto Serif CJK SC"),
    axis.title.x = element_text(
      margin = margin(b = 0, l = 0, t = 20, r = 0)
    ),
    axis.title.y = element_text(
      margin = margin(b = 0, l = 0, t = 0, r = 20)
    ),
    panel.border = element_rect(color = "black"),
    panel.grid = element_blank(),
    axis.ticks.length = unit(0.25, "cm"),
    axis.text.x = element_text(
      family = "Noto Sans", color = "black",
      vjust = -1.5, size = rel(1.25)
    ),
    axis.text.y = element_text(
      family = "Noto Sans", color = "black",
      angle = 90, vjust = 1.5, hjust = 0.5,
      size = rel(1.25)
    )
  )
汞蒸气的压力随温度的指数级变化
(a) Base R 图形
汞蒸气的压力随温度的指数级变化
(b) ggplot2 图形
图 1: 中英文字体设置

图 2 是一幅手绘漫画风格的图形,展示了三种不同鸢尾花的萼片宽度和长度的关系。

代码
# brew tap homebrew/cask-fonts
# brew install --cask font-xkcd
if (xfun::is_macos()) {
  sysfonts::font_add("xkcd", regular = "xkcd.otf")
} else {
  sysfonts::font_add("xkcd", regular = "xkcd.ttf")
}
ggplot(data = iris, aes(Sepal.Length, Sepal.Width)) +
  geom_point(aes(color = Species, shape = Species)) +
  scale_color_grey() +
  theme_bw(base_size = 13, base_family = "xkcd") +
  theme(
    panel.border = element_rect(color = "black"),
    panel.grid = element_blank()
  )
图 2: 手绘漫画风格的图形

如读者所见,本书不会局限于作图的工具,除了上面已经展示的 Base R 和 ggplot2,还会陆续用到 lattice (Sarkar 2008)rgl 包,甚至会超出 R 语言的范畴,介绍 LaTeX 世界里的 TikZ 和 JavaScript 中的 WebGL 等。

在掌握各类现代的绘图技术后,回归统计图形的落脚点,从数据传递的信息出发,选择合适的图形和实现工具,兼顾美观,到达「道」与「术」和谐统一的境界。