前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >107-R可视化31-利用ggplot延迟映射作图

107-R可视化31-利用ggplot延迟映射作图

作者头像
北野茶缸子
发布2022-04-05 15:24:43
发布2022-04-05 15:24:43
46300
代码可运行
举报
运行总次数:0
代码可运行
  • 参考:
    • 第 31 章 ggplot2之延迟映射 | 数据科学中的 R 语言 (bookdown.org)[1]
    • A ggplot2 Tutorial for Beautiful Plotting in R - Cédric Scherer (cedricscherer.com)[2]

前言

主要是看到了一张好看的图:

顺手学习一下它的画图技巧。

在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 呢?

代码语言:javascript
代码运行次数:0
复制
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" 就好了。

但既然学了延迟计算,我们为啥不用他呢?

代码语言:javascript
代码运行次数:0
复制
iris %>%
  ggplot(aes(x = Sepal.Length)) +
  geom_histogram(aes(y = after_stat(count/max(count))))

颜色美化作图

仔细研究一下这张图:

不难发现,它其实是外围大的color 和内圈小的color 正好渐变色相反了。

也就是说,我强行给一组渐变色给color,在rev 一下它们给另外的color,就很容易实现了。

西卡西啊,我们现在可是有了延迟映射的骚操作了。

代码语言:javascript
代码运行次数:0
复制
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生效。

比如如果是:

代码语言:javascript
代码运行次数:0
复制
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 处理一下:

代码语言:javascript
代码运行次数:0
复制
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 这层信息的。

代码语言:javascript
代码运行次数:0
复制
> 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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 北野茶缸子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 延迟映射的三阶段
  • 统计计算图应用
  • 颜色美化作图
    • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档