第 11 章 可视化之配色

library(ggplot2)           # ggplot2 图形
library(patchwork)
library(magrittr)

David Robinson 给出为何使用 ggplot2 31 当然也有 Jeff Leek 指出在某些重要场合不适合 ggplot2 32 并且给出强有力的 证据,其实不管怎么样,适合自己的才是好的。也不枉费 Garrick Aden-Buie 花费 160 页幻灯片逐步分解介绍 优雅的ggplot2Malcolm Barrett 也介绍了 ggplot2 基础用法,还有 Selva Prabhakaran 精心总结给出了 50 个 ggplot2 数据可视化的 例子 以及 Victor Perrier 为小白用 ggplot2 操碎了心地开发 RStudio 插件 esquisse 包,Claus O. Wilke 教你一步步创建出版级的图形 https://github.com/clauswilke/practical_ggplot2

ggplot2 是十分方便的统计作图工具,相比 Base R,为了一张出版级的图形,不需要去调整每个参数,实现快速出图。集成了很多其它统计计算的 R 包,支持丰富的统计分析和计算功能,如回归、平滑等,实现了作图和模型的无缝连接。比如图11.1,使用 loess 局部多项式平滑得到数据的趋势,不仅仅是散点图,代码量也非常少。

ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(color = class)) +
  geom_smooth(se = TRUE, method = "loess") +
  labs(
    title = "Fuel efficiency generally decreases with engine size",
    subtitle = "Two seaters (sports cars) are an exception because of their light weight",
    caption = "Data from fueleconomy.gov"
  )
简洁美观

图 11.1: 简洁美观

故事源于一幅图片,我不记得第一次见到这幅图是什么时候了,只因多次在多个场合中见过,所以留下了深刻的印象,后来才知道它出自于一篇博文 — Using R packages and education to scale Data Science at Airbnb,作者 Ricardo Bion 还在其 Github 上传了相关代码33

如 Berton Gunter 所说,数据可视化只是一种手段,根据数据实际情况作展示才是重要的,并不是要追求酷炫。

3-D bar plots are an abomination. Just because Excel can do them doesn’t mean you should. (Dismount pulpit).

— Berton Gunter 34

gridlatticeggplot2 的基础,gganimate 是 ggplot2 一个扩展,它将静态图形视为帧,调用第三方工具合成 GIF 动图或 MP4 视频等,要想深入了解 ggplot2,可以去看 Hadley Wickham, Danielle Navarro, and Thomas Lin Pedersen 合著的《ggplot2: elegant graphics for data analysis》第三版 https://ggplot2-book.org/

配色真的是一门学问,有的人功力非常深厚,仅用黑白灰就可以创造出一个世界,如中国的水墨画,科波拉执导的《教父》,沃卓斯基姐妹执导的《黑客帝国》等。黑西装、白衬衫和黑领带是《黑客帝国》的经典元素,《教父》开场的黑西装、黑领结和白衬衫,尤其胸前的红玫瑰更是点睛之笔。导演将黑白灰和光影混合形成了层次丰富立体的画面,打造了一场视觉盛宴,无论是呈现在纸上还是银幕上都可以给人留下深刻的印象。正所谓食色性也,花花世界,岂能都是法印眼中的白骨!再说《红楼梦》里,芍药丛中,桃花树下,滴翠亭边,栊翠庵里,处处都是湘云、黛玉、宝钗、妙玉留下的四季诗歌。

filled.contour(volcano, nlevels = 10, color.palette = terrain.colors)
filled.contour(volcano, nlevels = 10, color.palette = heat.colors)
filled.contour(volcano, nlevels = 10, color.palette = topo.colors)
filled.contour(volcano, nlevels = 10, color.palette = cm.colors)
R 3.6.0 以前的调色板R 3.6.0 以前的调色板R 3.6.0 以前的调色板R 3.6.0 以前的调色板

图 11.2: R 3.6.0 以前的调色板

filled.contour(volcano,
  nlevels = 10,
  color.palette = function(n, ...) hcl.colors(n, "Grays", rev = TRUE, ...)
)
filled.contour(volcano,
  nlevels = 10,
  color.palette = function(n, ...) hcl.colors(n, "YlOrRd", rev = TRUE, ...)
)
filled.contour(volcano,
  nlevels = 10,
  color.palette = function(n, ...) hcl.colors(n, "purples", rev = TRUE, ...)
)
filled.contour(volcano,
  nlevels = 10,
  color.palette = function(n, ...) hcl.colors(n, "viridis", rev = FALSE, ...)
)
R 3.6.0 以后的调色板R 3.6.0 以后的调色板R 3.6.0 以后的调色板R 3.6.0 以后的调色板

图 11.3: R 3.6.0 以后的调色板

hcl.colors() 函数是在 R 3.6.0 引入的,之前的 R 软件版本中没有,同时内置了 110 个调色板,详见 hcl.pals()