将第二个变量添加到 R 中的散点图

Issue adding second variable to scatter plot in R

为作业设置了这个问题 - 但我以前从未使用过 R - 感谢任何帮助。 非常感谢。
题: 制作散点图以比较 1950 年至 2019 年间巴西和阿根廷的二氧化碳排放量…… 我可以为巴西获取它,但不知道如何添加阿根廷。 我想我必须用 geom_point 和过滤器做点什么?

df%>%
  filter(Country=="Brazil", Year<=2019 & Year>=1950) %>%
  ggplot(aes(x = Year, y = CO2_annual_tonnes)) + 
    geom_point(na.rm =TRUE, shape=20, size=2, colour="green") + 
    labs(x = "Year", y = "CO2Emmissions (tonnes)")

答案取决于你想做什么,但通常在散点图中添加另一个维度,你已经有明确的 xy 维度是通过应用美学 (颜色、形状等)或通过刻面。

在这两种方法中,您实际上不想过滤数据。您可以使用美学或分面以某种方式“过滤”并根据数据集中的 country 列适当地映射数据。如果您的数据集包含的国家多于阿根廷和巴西,您将希望过滤以仅包含这些国家,因此:

your_filtered_df <- your_df %>%
    dplyr::filter(Country %in% c("Argentina", "Brazil"))

刻面

Faceting 是另一种表示您想将一个地块分成两个独立地块的方式(一个用于阿根廷,一个用于巴西)。每个地块都将具有相同的美学(看起来相同),但将具有适当的“过滤”数据集。

你的情况,你可以试试:

your_filtered_df %>%
ggplot(aes(x = Year, y = CO2_annual_tonnes)) +
    geom_point(na.rm =TRUE, shape=20, size=2, colour="green") +
    facet_wrap(~Country)

美学

在这里,您有很多选择。这个想法是告诉 ggplot2 将点 geom 中各个点的 外观映射到 your_filtered_df$Country 中指定的值。为此,您可以将 geom_point() 的美学参数之一放在 aes() 中。例如,如果您使用 shape=,它可能如下所示:

your_filtered_df %>%
    ggplot(aes(x = Year, y = CO2_annual_tonnes)) +
        geom_point(aes(shape=Country), na.rm =TRUE, size=2, colour="green")

这应该显示一个图例,该图例创建了图例,并为对应于国家名称的点提供了两种不同的形状。 非常重要要记住,当你把像 shapecolorsize 这样的美学放在 aes() 中时,你 一定不能在外面也有。因此,这将正确运行:

geom_point(aes(colour=Country), ...)

但这不会:

geom_point(aes(colour=Country), colour="green", ...)

当一种审美在外部时,它会覆盖 aes() 中的审美。第二个仍将所有点显示为绿色。

不要这样做...但它有效

OP 发表了一条评论,指出了教授的一些额外提示,即:

We were given the hint in the question "you can embed piped filter functions within geom_point objects"

我相信他们指的是最终的……非常糟糕的生成点数的方法。此方法需要您拥有 两个 geom_point() 个对象,并向每个对象发送不同的过滤数据集。您可以通过访问每个 geom_point() 对象中的 data= 参数来执行此操作。这种方法有很多问题,包括没有生成图例,但是如果你只是 必须 这样做......这里是:

# painful to write this.  it goes against all good practices with ggplot
your_filtered_df %>%
    ggplot(aes(x = Year, y = CO2_annual_tonnes)) +
    geom_point(data=your_filtered_df %>% dplyr::filter(Country=="Argentina"),
        color="green", shape=20) +
    geom_point(data=your_filtered_df %>% dplyr::filter(Country=="Brazil"),
        color="red", shape=20)

您应该明白为什么这不是一个好的约定。想一想如果代表 50 个不同的国家/地区,您会怎么做……上面的代码或方法可以工作,但是使用这种方法,您的绘图中将有 50 个单独的 geom_point() 对象……呃。不要打错字!