forked from perlatex/R_for_Data_Science
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tidyverse_ggplot2_aes_eval.Rmd
71 lines (46 loc) · 2.41 KB
/
tidyverse_ggplot2_aes_eval.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# ggplot2之延迟映射 {#tidyverse-ggplot2-aes-eval}
本章是翻译的ggplot的官方文档,后续我会增加一些案例
```{r, message=FALSE, warning=FALSE}
library(tidyverse)
library(palmerpenguins)
penguins <- penguins %>%
drop_na()
```
绝大部分时候,数据框的变量直接映射到图形元素,然后生成图片。但也有一些时候,变量需要先做统计变换,然后再映射给图形元素,这个过程称之为**延迟映射**。
ggplot2 把进行数据映射分成了三个阶段。
- 第一个阶段,**拿到数据之后**。最初阶段,拿到用户提供的数据,映射给图形元素。
- 第二个阶段,**统计变换之后**。数据完成转化或者统计计算之后,再映射给图形元素。
- 第三个阶段,**图形标度之后**。数据完成标度配置之后,映射给图形元素,在最后渲染出图之前。
延迟到**统计变换之后**的例子是,在`geom_histogram()`画柱状图的时候,
柱子的高度并不直接来源用户提供的数据,而是来源于`stat_bin()`函数统计计算后的结果
```{r}
penguins %>%
ggplot(aes(x = bill_length_mm)) +
geom_histogram(aes(y = after_stat(count)))
```
```{r}
# Scale tallest bin to 1
penguins %>%
ggplot(aes(x = bill_length_mm)) +
geom_histogram(aes(y = after_stat(count) / max(count)))
```
延迟到**图形标度之后**的例子是,`geom_bar()`画柱子图,定义了柱子的颜色后,想在颜色的基础上增加点透明度,作为柱子的填充色。
```{r}
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)` 控制每一个过程。
```{r}
penguins %>%
ggplot(aes(x = species)) +
geom_bar(
aes(fill = stage(start = species, after_scale = alpha(fill, 0.4)))
)
```
```{r, echo = F, message = F, warning = F, results = "hide"}
pacman::p_unload(pacman::p_loaded(), character.only = TRUE)
```