第 31 章 ggplot2之延迟映射

本章是翻译的ggplot的官方文档,后续我会增加一些案例

绝大部分时候,数据框的变量直接映射到图形元素,然后生成图片。但也有一些时候,变量需要先做统计变换,然后再映射给图形元素,这个过程称之为延迟映射

ggplot2 把进行数据映射分成了三个阶段。

  • 第一个阶段,拿到数据之后。最初阶段,拿到用户提供的数据,映射给图形元素。
  • 第二个阶段,统计变换之后。数据完成转化或者统计计算之后,再映射给图形元素。
  • 第三个阶段,图形标度之后。数据完成标度配置之后,映射给图形元素,在最后渲染出图之前。

延迟到统计变换之后的例子是,在geom_histogram()画柱状图的时候, 柱子的高度并不直接来源用户提供的数据,而是来源于stat_bin()函数统计计算后的结果

penguins %>%
  ggplot(aes(x = bill_length_mm)) +
  geom_histogram(aes(y = after_stat(count)))
# Scale tallest bin to 1
penguins %>%
  ggplot(aes(x = bill_length_mm)) +
  geom_histogram(aes(y = after_stat(count) / max(count)))

延迟到图形标度之后的例子是,geom_bar()画柱子图,定义了柱子的颜色后,想在颜色的基础上增加点透明度,作为柱子的填充色。

penguins %>% 
  ggplot(aes(x = species, color = species)) +
  geom_bar(
    aes(fill = after_scale(alpha(color, 0.6)))
  )

如果不是直接使用原始数据,而是用统计变换后的数据来映射,就需要使用after_stat()函数告诉ggplot2 等到统计变换完成后再做美学映射。类似地,如果想在完成标度配置之后,再映射给图形元素,就需要使用after_scale()函数。如果多次映射图形元素,比如变量 x 先传递给统计函数,然后把统计结果映射给图形元素,就需要使用 stage(start = NULL, after_stat = NULL, after_scale = NULL) 控制每一个过程。

penguins %>% 
  ggplot(aes(x = species)) +
  geom_bar(
    aes(fill = stage(start = species, after_scale = alpha(fill, 0.4)))
  )