【问题标题】:R ggplot2 - Understanding the parameters of the aes functionR ggplot2 - 了解aes函数的参数
【发布时间】:2021-11-02 22:06:31
【问题描述】:

我正在学习 R 和 ggplot2,但真正让我困惑的一件事是 aes 函数可用的参数。

我精通 Python 和 Java 等编程语言。在这样的编程语言中,您定义了一个函数,并且它的参数也是预定义的,并且您期望一个函数可以采用如此多的参数。

但是这里使用 aes 函数似乎很不一样,除了它的 'x' 和 'y' 参数。例如:

 ggplot(forestarea, aes(income))+geom_bar(aes(fill=region))+   labs(x="Regions", y="Number of countries",
       title="Number of countries by income level from each region in the world",
       caption="The WDI Forest Area Indicator")

在上面的代码中,在第二个aes函数中,'fill'参数似乎与'geom_bar'函数相关联。真的是geom_bar的参数吗?

然后:

ggplot(forestarea, aes(factor(1), fill= income))+geom_bar()+    coord_polar(theta="y")+   theme(axis.line = element_blank(), panel.background = element_blank()) +   theme(axis.text = element_blank()) +   theme(axis.ticks = element_blank()) +   labs(x=NULL, y=NULL, fill="Income level",
       title="Proportion of countries by income level",
       caption="WDI Forest Area Indicator")

这段代码创建了一个饼图,但是你可以看到'fill'参数在geom_bar函数之外的aes函数内部,我很困惑。是不是aes的参数?

然后:

ggplot(land_and_agrpc, aes(area = AG.LND.FRST.K2, fill = AG.LND.AGRI.ZS, label=country)) +
  geom_treemap() + geom_treemap_text() +
  labs(title="Countries by land area",
       fill="% of agriculture land",
       caption="WDI country land area and forest land percentage datasets")

此代码用于创建树形图,您可以看到 aes 函数采用 'area' 参数,树形图的文档中对此进行了说明:https://cran.r-project.org/web/packages/treemapify/vignettes/introduction-to-treemapify.html。我更加困惑了。

那么,我如何解释 aes 函数的参数,在哪里使用它们(在 'ggplot' 或 'geom_XXX' 函数内)?

【问题讨论】:

  • 每个 geom 的文档都列出了一个“美学”部分,概述了该 geom 理解的美学。也许这会有所帮助?文档的该部分还指向vignette("ggplot2-specs"),以获取有关美学规格的更多详细信息。另请注意,在ggplot() 层内使用aes() 指定美学全局,这意味着它们会传递到图中的所有后续几何层。在 geom 中的 aes() 中指定美学意味着您只为该特定层指定美学。
  • 谢谢,非常感谢,这帮助我理解了函数

标签: r ggplot2


【解决方案1】:

考虑下面的代码块:

library(ggplot2)

df <- data.frame(
  x = c(1, 2), y = c(2, 1)
)

ggplot(df, aes(x, y + 1)) +
  geom_point(colour = "green") +
  geom_line(aes(colour = "blue"))

在这里,aes(x, y + 1) 表示aes(x = x, y = y + 1),它将某些层理解的xy 美学设置为数据框的xy 列。这是因为aes() 具有三个参数,xy...。例如,通过不声明x = x,第一个变量x 通过函数调用中的位置与x 参数匹配。必须命名除xy 之外的其他参数,例如aes(size = 10) 并通过... 传递以成为映射的一部分(它们是名称-表达式对)。

因为表达式 y = y + 1 是在 aes() 中使用“非标准评估”进行评估的,所以范围规则发生了变化,变量 y 将首先尝试在数据列的上下文中进行评估,而不是在全局环境,因此我们可以在数据框列上“计算”+1

确定什么是有效的argument = value 映射的不是aes() 函数,而是接受或拒绝参数的层。您可以在该层的文档中找到该层接受的参数,例如在?geom_point,您会看到它理解xy,alphacolourfillgroupshapesizestroke。如果您致电your_geom_layer$geom$aesthetics(),您应该能够找到这些信息。扩展包可以用自己的审美定义自己的层,例如 {treemap} 包中的area

此外,因为我们已经在 ggplot() 主调用中定义了 aes(x, y + 1),它将应用于该图中的每个几何或统计图层,在本例中为点和线。因此,我们不需要在每一层中重复相同的映射,除非您在层中设置inherit.aes = FALSE,否则它会被继承。

在点层中,我们定义了colour = "green" outside aes() 函数,因此它将按字面意思解释(并遵循通常的范围规则的标准评估)。人们也将其称为“静态”映射,您只能在图层中使用它,而不能在全局范围内使用。相比之下,因为我们在线条层中定义了aes(colour = "blue"),所以"blue" 将被解释为一个分类变量,它参与具有自己调色板的色标(“动态”映射)。如果您执行代码,您将看到该线不是蓝色,而是带有图例的鲑鱼色,该图例将分类值“蓝色”映射到具有 1 色调色板的离散刻度。因为"blue" 不是数据框中的列,也不是全局环境中的变量,所以会被解释为长度为 1 的向量,将被回收以适应数据框中的行数。

一般来说,如果你想将某些东西映射到一个比例(包括位置比例,例如xy),你把它放在aes() 里面。如果你想有一个字面解释,你把它放在aes()之外的相关层。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    相关资源
    最近更新 更多