我是一名经验丰富的ggplot2
名用户,并将其教给大学生.然而,我只是遇到了一个使用以下语法的示例:
ggplot(mtcars) + aes(cyl) + geom_histogram()
这比在ggplot()
或geom_
中指定aes
更适合于添加层的逻辑...但在ggplot2帮助中似乎没有记录.因此,我想知道这个语法是否有限制/不应该使用的原因?(显然,我认为如果要在geom之间有所不同,就需要在geom中指定它……)
我是一名经验丰富的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的人来说,这应该被视为一种高级技巧.我发现它最常见的用例是更改在扩展包(例如ggsurvplot
或ggraph
)中创建的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))
所以底线是,如果你想的话,你可以使用它,但最好不要把它教给初学者