在facet_grid中更改构面标签并同时添加geom_vline时发生错误

时间:2018-03-19 04:33:15

标签: r ggplot2 facet

我试图在不修改数据框的情况下更改构面标签,并在图中添加一条垂直线以增强可理解性。

library(ggplot2)
df <- data.frame(weeks = rep(-3:3, each = 2),
                 is_manual = rep(c(TRUE, FALSE), times = 7),
                 value = c(rnorm(7, 10), rnorm(7, 20)))

# Plotting
ggplot(df, aes(x = weeks, y = value)) + geom_line() +
  facet_grid(is_manual ~ .) +
  geom_vline(xintercept = 0, color = "blue", linetype = 2)

给了我这个,工作正常:

plot1.png

现在我想更改构面标签,以便每个人都知道什么是真和假。

ggplot(df, aes(x = weeks, y = value)) + geom_line() +
  facet_grid(ifelse(is_manual, "Manual", "Uploaded") ~ .) +
  geom_vline(xintercept = 0, color = "blue", linetype = 2)

,但它返回错误:

  

ifelse错误(is_manual,“手动”,“已上传”):找不到对象'is_manual'

但是,一旦我删除geom_vline部分,它就会正常工作,这意味着应该能够找到'is_manual'。

ggplot(df, aes(x = weeks, y = value)) + geom_line() +
  facet_grid(ifelse(is_manual, "Manual", "Uploaded") ~ .)

plot2.png

我可以通过

来解决
df$is_manual <- ifelse(df$is_manual, "Manual", "Uploaded")
ggplot(df, aes(x = weeks, y = value)) + geom_line() +
  facet_grid(is_manual ~ .) +
  geom_vline(xintercept = 0, color = "blue", linetype = 2)

,但它会更改我的基础数据。

更改数据框内容时,有没有办法可以同时更改构面标签并添加垂直线?或者这是一个需要报告的错误?

1 个答案:

答案 0 :(得分:3)

只是猜测一下,但是geom_vline可能会将原始数据框df中的构面标签名称传递给ggplot,而不是facet_grid中使用的更新公式} {,geom_vline无法找出构面的位置时导致错误。

在任何情况下,您都可以使用dplyr管道(%>%)动态更新基础数据,而不是更改基础数据,并避免错误:

library(tidyverse) 

ggplot(df %>% mutate(is_manual = ifelse(is_manual, "Manual", "Uploaded"),
       aes(x = weeks, y = value)) + geom_line() +
  facet_grid(is_manual ~ .) +
  geom_vline(xintercept = 0, color = "blue", linetype = 2)