ggplot2的5个组件分别为:数据(data)、图形属性映射(mapping)、几何对象(geom)、统计变换(stat)、位置调整(position)。这些组件均可以通过图层进行构建。
数据
- 可以在
ggplot()函数中指定默认的数据集。
- 当不同图层使用不同的数据集时,可以在每个
geom层中分别指定数据集,注意,此时的参数data不能省略。
- 建议在作图前对数据进行充分的预处理,以避免出现大量使用
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)))
图形属性映射
-
aes()函数用于指定变量的映射关系,它可以对数据进行处理(例如使用log()转换),但最好仅作一些简单的计算,避免过度的复杂化,尽量避免在aes()使用$符号。
- 在每一个图层内,均可以对映射对象进行增加、修改、删除的操作,以达成不同的效果。
- 我们可以将图层属性映射到一个变量(如
aes(color = cut)),或将其设定为一个常数(aes(color = "red"))。当我们用变量控制图形属性,则应将规则(color = cut)写入aes()函数中,如果仅需修改图形默认的尺寸或颜色,则将值写在aes()函数外面。
{#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}
几何对象
- 几何对象控制创建图形的类型,如点、线、面、条形图、箱线图等。
- 每个几何对象都有一系列独有的或公用的图形属性,例如点的集合对象要求坐标值位置、点的形状、大小等,而一个条形图则需要宽度、边界和填充颜色。
统计变换
统计图层
更多内容可参看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}
用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"
)
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: 在数据缩放后得出的变量进行美学映射。