我是一名经验丰富的ggplot2名用户,并将其教给大学生.然而,我只是遇到了一个使用以下语法的示例:

ggplot(mtcars) + aes(cyl) + geom_histogram()

这比在ggplot()geom_中指定aes更适合于添加层的逻辑...但在ggplot2帮助中似乎没有记录.因此,我想知道这个语法是否有限制/不应该使用的原因?(显然,我认为如果要在geom之间有所不同,就需要在geom中指定它……)

推荐答案

这几乎是一个基于观点的问题,但我认为它是关于主题的,因为它有助于澄清ggplot调用的语法和 struct .

在某种意义上,你已经自己回答了这个问题:

在ggplot2帮助中似乎没有任何地方对其进行记录

这一点,以及在线教程、博客和答案中几乎没有例子,是不以这种方式使用aes的充分理由(或者至少不教人们以这种方式使用aes).这可能会导致新用户感到困惑和沮丧.

这更符合叠加层的逻辑

这是事实,但可能有点误导.它实际做的是指定default美学贴图,后续图层将从ggplot对象本身继承.它应该与默认数据对象一起被视为基本图的核心part,因此在最初的ggplot调用中"属于",而不是添加或分层到图中的内容.如果创建的默认对象为ggplot,但没有数据和映射,则插槽仍然存在,但包含弃权,而不是NULL:

p <- ggplot()

p$mapping
#> Aesthetic mapping: 
#> <empty>

p$data
#> list()
#> attr(,"class")
#> [1] "waiver"

请注意,与"比例"和"坐标"对象不同(您可能会认为它们也是如此),数据和美学映射不能有默认值.

这是否意味着你应该使用这种语法?不,但对于精通ggplot的人来说,这应该被视为一种高级技巧.我发现它最常见的用例是更改在扩展包(例如ggsurvplotggraph)中创建的ggplot的映射,其中绘图函数使用ggplot左右的包装器.它还可以用于快速创建具有相同主题和 colored颜色 比例的多个情节:

p <- ggplot(iris, aes(Sepal.Width, Sepal.Length)) + 
  geom_point(aes(color = Species)) +
  theme_light()

library(patchwork)

p + (p + aes(Petal.Width, Petal.Length))

enter image description here

所以底线是,如果你想的话,你可以使用它,但最好不要把它教给初学者

R相关问答推荐

从有序数据中随机抽样

按R中的组查找相邻列的行累积和的最大值

使用tidyverse方法绑定行并从一组管道列表执行左连接

r替换lme S4对象的字符串的一部分

bslib::card_header中的shine::downloadButton,图标而不是文本

将包含卷的底部25%的组拆分为2行

par函数中的缩写,比如mgp,mar,mai是如何被破译的?

在不丢失空值的情况下取消列出嵌套列表

您是否可以使用facet_rap设置一个较低的限制来对ggmap上的比例中断进行zoom ?

使用R中的dist()迭代ID匹配的欧几里德距离

解析嵌套程度极高的地理数据

`-`是否也用于数据帧,有时使用引用调用?

数据集上的R循环和存储模型系数

如何在GALT包的函数&geom_x样条线中调整线宽

R-找出存在其他变量的各种大小的所有组合

我已经运行了几个月的代码的`Palette()`中出现了新的gglot错误

使用R、拼图和可能的网格包绘制两个地块的公共垂直线

conditionPanel不考虑以下条件

通过比较来自多个数据框的值和R中的条件来添加新列

用逗号拆分字符串,并删除一些字符