主要是看到了一张好看的图:
顺手学习一下它的画图技巧。
在ggplot 的绘图中geom 或stat 的关系是密不可分的,当我们(显式)调用geom 时,相当于隐式的调用了stat 了。所以二者择其一即可。
因此你可以凭借你的心情,通过geom 或stat 创建你的图形对象。
通常来说,数据框的变量直接映射到图形元素,然后生成图片。但也有一些时候,变量需要先做统计变换,然后再映射给图形元素,这个过程称之为延迟映射。比如geom_bar 亦或是geom_histogram,还记得之前说过的[[56-R可视化5-ggplot2三部曲之基础二]] stat = identity
参数吗?
直接参考第 31 章 ggplot2之延迟映射 | 数据科学中的 R 语言 (bookdown.org)
中记录的内容:
接下来就是延迟映射的两种应用了。
正如上面的三阶段所述,geom_bar 亦或是geom_histogram 会经历一定的统计变换——它们并不需要我们传入y轴信息。
但如果我们想要修改坐标轴的量纲呢?
因为这个y 轴并不是我们传入的数值,而是stat 延迟计算的结果,因此,直接对y 轴数值操作显然是不行的,那么scale 呢?
iris %>%
ggplot(aes(x = Sepal.Length)) +
geom_histogram() %>%
scale_y_continuous(trans = "log")
Error in as.vector(x, "character") :
cannot coerce type 'environment' to vector of type 'character'
显然也有问题。
如果不考虑延迟计算的话,其实对于count 数值这种简单统计,在[[65-R茶话会14-柱状图用col还是bar,你可以省一点空间]] 我们就已经说过了。相当于绕过了stat 的计算。接着指定一下stat = "identity"
就好了。
但既然学了延迟计算,我们为啥不用他呢?
iris %>%
ggplot(aes(x = Sepal.Length)) +
geom_histogram(aes(y = after_stat(count/max(count))))
仔细研究一下这张图:
不难发现,它其实是外围大的color 和内圈小的color 正好渐变色相反了。
也就是说,我强行给一组渐变色给color,在rev 一下它们给另外的color,就很容易实现了。
西卡西啊,我们现在可是有了延迟映射的骚操作了。
library(ggdark)
chic <- readr::read_csv("https://raw.githubusercontent.com/z3tt/ggplot-courses/master/data/chicago-nmmaps.csv")
# 如果下载失败可以先保存到本地
# 或者使用我的
# https://www.jianguoyun.com/p/DaFRpdcQqKXmBxi01q4E
ggplot(chic, aes(date, temp, color = temp)) +
geom_point(size = 5) +
geom_point(aes(color = temp,
color = after_scale(invert_color(color))),
size = 2) +
scale_color_scico(palette = "hawaii", guide = "none") +
labs(x = "Year", y = "Temperature (°F)")
不过有意思的是,仿佛相同类型的元素(color)需要被重复赋值才能被after_scale生效。
比如如果是:
ggplot(chic, aes(date, temp,
color = temp)) +
geom_point(size = 5) +
geom_point(aes(
#color = temp,
color = after_scale(invert_color(color))),
size = 2) +
scale_color_scico(palette = "hawaii", guide = "none") +
labs(x = "Year", y = "Temperature (°F)")
并不会生效。
但是,如果先在全局中设定了color,而after_scale 设定的是其他映射,并不需要duplicated 处理一下:
ggplot(mpg, aes(class, hwy,
colour = class)) +
geom_boxplot(aes(fill = after_scale((invert_color(colour)))),
alpha = 0.2) +
ggsci::scale_color_jama()
ps:其实如果是非连续的,或者里外顺序并不顺反一致,也挺辣眼睛的嘛。
确实很好玩,因为全局的图层确实是记录有color 这层信息的。
> p1$mapping
Aesthetic mapping:
* `x` -> `date`
* `y` -> `temp`
* `colour` -> `temp`
[1]
第 31 章 ggplot2之延迟映射 | 数据科学中的 R 语言 (bookdown.org): https://bookdown.org/wangminjie/R4DS/tidyverse-ggplot2-aes-eval.html
[2]
A ggplot2 Tutorial for Beautiful Plotting in R - Cédric Scherer (cedricscherer.com): https://www.cedricscherer.com/2019/08/05/a-ggplot2-tutorial-for-beautiful-plotting-in-r/#prep