我想制作一个类似于这个的斜坡图。理想情况下,我希望能够在dplyr风格的链中完成所有操作,但是当我尝试对数据进行子集化以添加特定的geom_text
标签时,遇到了问题。以下是一个玩具示例:
# make tbl:
df <- tibble(
area = rep(c("Health", "Education"), 6),
sub_area = rep(c("Staff", "Projects", "Activities"), 4),
year = c(rep(2016, 6), rep(2017, 6)),
value = rep(c(15000, 12000, 18000), 4)
) %>% arrange(area)
# plot:
df %>% filter(area == "Health") %>%
ggplot() +
geom_line(aes(x = as.factor(year), y = value,
group = sub_area, color = sub_area), size = 2) +
geom_point(aes(x = as.factor(year), y = value,
group = sub_area, color = sub_area), size = 2) +
theme_minimal(base_size = 18) +
geom_text(data = dplyr::filter(., year == 2016 & sub_area == "Activities"),
aes(x = as.factor(year), y = value,
color = sub_area, label = area), size = 6, hjust = 1)
但是这给了我一个Error in filter_(.data, .dots = lazyeval::lazy_dots(...)) :
object '.' not found
的错误。使用子集而不是dplyr::filter
会给我一个类似的错误。我在SO/Google上找到的是这个问题,它解决了一个略微不同的问题。
在这样的链中,正确的数据子集是什么?
编辑:我的reprex是一个简化的例子,在实际工作中我有一个长链。Mike下面的评论适用于第一种情况,但不适用于第二种情况。
.
替换成df
怎么样? - Mike H.df %>% filter(area == "Health") %>% { ggplot(.) + geom_line(aes(x = as.factor(year), y = value, group = sub_area, color = sub_area), size = 2) + geom_point(aes(x = as.factor(year), y = value, group = sub_area, color = sub_area), size = 2) + geom_text(data = dplyr::filter(., year == 2016 & sub_area == "Activities"), aes(x = as.factor(year), y = value, color = sub_area, label = area), size = 6, hjust = 1) }
我不确定它是否能给您想要的结果,但至少这是一张图表。 - alistaireaes()
中的变量前面需要数据框的名称(我的真实示例是一个长管道,数据框不是首先创建的)。但是感谢您,在全局环境中使用时有效。 - RobertMyles?magrittr::\
%>%`。通常,管道将左侧操作的结果传递给右侧第一个参数,但如果您将 RHS 包装在大括号中,则只会将结果发送到您放置
. `的位置,这使您可以在子管道内重复使用它或跨多个调用使用它。 - alistaire