【问题标题】:Issue adding second variable to scatter plot in R问题将第二个变量添加到 R 中的散点图
【发布时间】:2021-12-14 17:21:15
【问题描述】:

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

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)")

【问题讨论】:

  • 我建议通过一些关于 ggplot 的初学者教程来了解它是如何工作的,因为这或多或少是一个关于如何使用 ggplot 的问题。官方文档非常详尽,并链接到更多教程。

标签: r ggplot2 filter geom-point


【解决方案1】:

答案取决于您要做什么,但通常在散点图中添加另一个维度,您已经清楚 xy 维度是通过应用美学(颜色、形状等)来完成的或通过刻面。

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

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

刻面

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

你的情况,你可以试试:

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 发表了一条评论,指出教授的一些额外提示,即:

我们在问题“您可以嵌入管道过滤器”中得到提示 geom_point 对象中的函数"

我相信他们指的是最终的......产生分数的非常糟糕的方式。此方法需要您有 两个 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() 对象……呃。不要打错字!

【讨论】:

  • 非常感谢 - 现在就试试这个。我们在问题“你可以在 geom_point 对象中嵌入管道过滤器函数”中得到提示,如果这对老师希望我们做的事情有任何用处。
  • 哦不...他们不希望您使用两个geom_point() 对象,对吗?最糟糕的做法是通过data= 为两个geom_point() 对象提供不同的过滤数据帧。我会发布一个编辑,给你一个可怕的禁忌......
  • 太好了,这已经奏效了——给我这个df%&gt;% dplyr::filter(Country %in% c("Argentina", "Brazil")) %&gt;% filter(Year&lt;=2019 &amp; Year&gt;=1950) %&gt;% 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)")
  • 谢谢 - 我会记住这不是未来的正确方式!
猜你喜欢
  • 1970-01-01
  • 2021-10-12
  • 2020-05-05
  • 2013-05-05
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多