我正在尝试使用以下条件在散点图中突出显示gapminder数据集中的某些数据点:
year == 2012,
continent == Asia,
population > median(population).
我面对的是问题,我每次必须在每个 geom_point()层中使用 year == 2012 过滤数据认为一次又一次地对相同的数据进行过滤,并不必要地花费时间和计算。
如何为 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和年份,则它不起作用并给出错误
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() +
那么如何使我的代码更高效?
答案 0 :(得分:1)
@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年,没有生育力,而且各列的名称也不同...),所以我将该示例更改为更简单的示例。