Есть ли способ фильтровать данные внутри geom_point () без упоминания фрейма данных? - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь выделить определенные точки данных из набора данных gapminder на точечной диаграмме со следующими критериями:

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

введите описание изображения здесь

Проблема Я столкнулся с тем, что мне приходится каждый раз фильтровать данные с помощью year == 2012 внутри каждого geom_point () слой, который, как мне кажется, снова и снова выполняет одну и ту же фильтрацию данных на каждом уровне и ненужные затраты времени и вычислений.

Как я могу отфильтровать эти данные один раз для год == 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  %>% 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() +

Итак, как я могу сделать свой код более эффективным?

1 Ответ

1 голос
/ 09 июля 2020

Как @AllanCameron указывает в комментариях, самым простым способом было бы создать новый фрейм данных. Но, если вы хотите передать его по конвейеру, это один из способов сделать это без повторения имени фрейма данных и фильтра года:

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 и нет плодородия, плюс столбцы имеют разные имена ...), поэтому Я изменил пример на более простой.

...