【问题标题】:Is there a way to filter data inside geom_point() without mentioning data frame?有没有办法在不提及数据框的情况下过滤 geom_point() 内的数据?
【发布时间】:2020-07-10 19:11:59
【问题描述】:

我正在尝试使用以下标准在散点图中突出显示 gapminder 数据集中的某些数据点:

year == 2012, 
continent == Asia, 
population > median(population). 

问题我面临的是我每次都必须在每个 geom_point() 层内使用 year == 2012 过滤数据think 是一次又一次地在每个级别进行相同的数据过滤,并且不必要地花费时间和计算。

如何为 year == 2012 过滤一次此数据并在所有级别使用(不想创建关于年份的新数据框)。

代码如下:

# Creating median population for filter criteria 
med_2012_pop <- gapminder %>% 
  filter(year == 2012 & continent == "Asia") %>% 
  select(population) %>% .$population %>% median(na.rm = T)

# plotting
gapminder  %>% 
ggplot(aes(x=fertility, y=life_expectancy, color=continent)) +
  # layer 1 - highlighted
  geom_point(data = filter(gapminder, year == 2012 & continent == "Asia" & population > med_2012_pop), 
             size=5, color="gray") +
  # layer 2 - base layer
  geom_point(data = filter(gapminder, year == 2012)) +
  # layer 3 Country highlight - Japan
  geom_point(data = filter(gapminder, year == 2012 & country == "Japan"), size=1, color="black") +
  geom_label(x=1.8, y=84, label="Japan", color="black", size=3) +
  theme_minimal() 

当我尝试下面的代码时 - 没有在 geom_point 中提及 gapminder 和 year 然后它不起作用并给出错误

gapminder  %>% filter(year == 2012)  %>% 
ggplot(aes(x=fertility, y=life_expectancy, color=continent)) +
  geom_point(data = filter(continent == "Asia" & population > med_2012_pop), 
             size=5, color="gray") +
  geom_point() +
  # Adding codes for Japan below
  geom_point(data = filter(country == "Japan"), size=1, color="black") +
  geom_label(x=1.8, y=84, label="Japan", color="black", size=3) 
  theme_minimal() +

那么我怎样才能让我的代码更有效率呢?

【问题讨论】:

  • 你考虑过gghighlight 包吗?
  • @Lstat 我从 gghighlight 包中看到了几个示例,但是由于我刚开始使用 R,所以我想先掌握基础知识,然后再转向提供快捷方式的包:)
  • 好吧,享受痛苦吧 :) 我已经查看了您的代码,恕我直言,您的“基础知识”已经正确。
  • @Lstat 哦,我以为我错过了一些东西,但如果我做得对,那么我想是时候转移到 gghighlight 了。再次感谢您的验证:)
  • @VineetSansi 为什么不使用df &lt;- filter(gapminder, Year == 2012) 然后在情节中使用df

标签: r ggplot2 dplyr highlight


【解决方案1】:

正如@AllanCameron 在 cmets 中指出的那样,最简单的方法是创建一个新的数据框。但是,如果您想“管道”,这是一种无需重复数据框名称和年份过滤器的方法:

library(gapminder)
library(tidyverse)
library(ggplot2)

gapminder %>%
  filter(year == 1992) %>% 
  ggplot(aes(x=gdpPercap, y=lifeExp, color=continent)) +
  geom_point(data = . %>% filter(continent == "Asia"), 
             size=5, color="gray") +
  geom_point() +
  theme_minimal()

您代码中的gapminder 数据框显然与我从包中获得的不同(我的没有 2012 年,也没有生育能力,而且列有不同的名称......),所以我改变了一个更简单的例子。

【讨论】:

  • 这正是我想要的。感谢分享解决方案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 2016-05-05
相关资源
最近更新 更多