ggplot2中用图层构建图像(一)

Author

Lee

Published

October 9, 2023

ggplot2的5个组件分别为:数据(data)、图形属性映射(mapping)、几何对象(geom)、统计变换(stat)、位置调整(position)。这些组件均可以通过图层进行构建。

1 数据

Note
  1. 可以在ggplot()函数中指定默认的数据集。
  2. 当不同图层使用不同的数据集时,可以在每个geom层中分别指定数据集,注意,此时的参数data不能省略
  3. 建议在作图前对数据进行充分的预处理,以避免出现大量使用2中的情况。
library(tidyverse)
showtext::showtext_auto()

class <- mpg %>%
  group_by(class) %>%
  summarise(n = n(), hwy = mean(hwy))

ggplot(mpg, aes(x = class, y = hwy)) +
  geom_jitter(width = 0.05, size = 2) +
  geom_point(data = class, aes(x = class, y = hwy), size = 5, color = "red") +
  geom_text(data = class, aes(y = 10, label = paste0("n = ", n)))

2 图形属性映射

Note
  1. aes()函数用于指定变量的映射关系,它可以对数据进行处理(例如使用log()转换),但最好仅作一些简单的计算,避免过度的复杂化,尽量避免在aes()使用$符号。
  2. 在每一个图层内,均可以对映射对象进行增加、修改、删除的操作,以达成不同的效果。
  3. 我们可以将图层属性映射到一个变量(如 aes(color = cut)),或将其设定为一个常数(aes(color = "red"))。当我们用变量控制图形属性,则应将规则(color = cut)写入aes()函数中,如果仅需修改图形默认的尺寸或颜色,则将值写在aes()函数外面。
library(patchwork)
p1 <- ggplot(mpg, aes(x = displ, y = hwy, color = class)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  theme(legend.position = "none")

p2 <- ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(aes(color = class)) +
  geom_smooth(method = "lm", se = FALSE) +
  theme(legend.position = "none")

p1 + p2

{#fig-practice 2-layer width=672}

p1 <- ggplot(mpg, aes(x = cty, y = hwy)) +
  geom_point(aes(color = "darkblue")) + # 相当于新建一个`darkblue`的变量,再将color映射到它
  labs(title = "规则写在aes()内")

p2 <- ggplot(mpg, aes(x = cty, y = hwy)) +
  geom_point(color = "darkblue") + # 相当于设置了默认的color
  labs(title = "规则写在aes()外")

p1 + p2

{#fig-practice 3-mapping width=672}

3 几何对象

Note
  1. 几何对象控制创建图形的类型,如点、线、面、条形图、箱线图等。
  2. 每个几何对象都有一系列独有的或公用的图形属性,例如点的集合对象要求坐标值位置、点的形状、大小等,而一个条形图则需要宽度、边界和填充颜色。

4 统计变换

4.1 统计图层

更多内容可参看ggplot2之统计图层

Note
  1. 许多几何对象的函数都包含默认的统计变换,如geom_bar()默认使用stat_count()进行计数,geom_boxplot()默认使用stat_boxplot()进行箱线图的计算。

  2. 一些不能用geom_xx()函数创建的统计变化函数:

  1. 我们可以用几何对象中的stat = ""参数来指定统计变换函数,或用stat_xx()函数来创建自定义的统计变换函数,并指定需要绘制的几何对象。ggplot2的作者更推荐使用前者
p1 <- ggplot(mpg, aes(x = trans, y = hwy)) +
  geom_point() +
  stat_summary(geom = "point", fun = "mean", color = "red", size = 4)

p2 <- ggplot(mpg, aes(x = trans, y = hwy)) +
  geom_point() +
  geom_point(stat = "summary", fun = "mean", color = "red", size = 4)

p1 + p2

{#fig-practice 4-stat width=672}

4.1.1 用stat_summary()函数理解统计并使用图层

  • stat_summary()中如果没有指定数据,则会从ggplot()函数中获取数据。
  • stat_summary()中的fun.data参数可以指定计算统计量的函数,将数据变形,返回数据框并用这个数据框绘制图形。
  • 如果fun.data返回的数据框包含了所需要的美学映射,图形就会显示出来。
  • 尽管数据是tidy的,但它未必能代表你想展示的值。解决办法不是去规整数据以符合几何形状的要求,而是将原初tidy数据传递给ggplot(), 让stat_*()函数在内部实现变形。
这部分内容略显抽象,需要持续不断的理解并加深应用。
my_penguins <- na.omit(penguins)

# 绘制误差线
my_penguins %>%
  ggplot(aes(sex, body_mass)) +
  stat_summary(
    fun.data = \(x) mean_se(x, mult = 1.96), # Increase `mult` value for bigger interval!
    geom = "errorbar",
  )

# 绘制带有彩色填充的柱状图
calc_median_and_color <- function(x, threshold = 40) {
  tibble(y = median(x)) %>%
    mutate(fill = ifelse(y < threshold, "pink", "grey35"))
}

my_penguins %>%
  ggplot(aes(species, bill_len)) +
  stat_summary(
    fun.data = calc_median_and_color,
    geom = "bar"
  )

4.2 Control aesthetic evaluation-延迟映射

大多数美学特征是从数据中的变量映射而来的。然而,有时你希望将映射延迟到渲染过程的后期。ggplot2 有三个数据阶段可以映射美学特征,并且有三个函数可以控制美学特征应在哪个阶段进行评估。

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

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

以上三个阶段分别对应了以下几个函数:

  • after_stat(x): 在统计变换之后进行评估。
  • after_scale(x): 在坐标轴缩放之后进行评估。
  • stage(start = NULL, after_stat = NULL, after_scale = NULL): 在特定阶段进行评估。

函数中的参数如下:

  • x: 使用由 after_stat(x)after_scale(x)函数计算出变量的进行美学映射。
  • start: 使用来自图层数据的变量进行美学映射。
  • after_stat: 使用由统计计算得出的变量进行美学映射。
  • after_scale: 在数据缩放后得出的变量进行美学映射。
penguins %>%
  ggplot(aes(x = species, color = species)) +
  geom_bar(
    aes(fill = species),
    alpha = 0.6
  )

5 位置调整