R 更改面网格中的面标签并同时添加几何线时出错

R 更改面网格中的面标签并同时添加几何线时出错,r,ggplot2,facet,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

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

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)
,但它返回一个错误:

ifelse中出错(is_manual、“manual”、“Upload”):找不到对象is_manual

但是,一旦我删除了
geom\u vline
部分,它就会正常工作,这意味着应该能够找到“is\u manual”

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

我可以通过做某事来解决问题

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)

df$在这里只是猜测,但可能
geom\u vline
是从传递到
ggplot
的原始数据帧
df
中获取面标签名称,而不是从
facet\u grid
中使用的更新公式中获取,从而在
geom\u 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)

我突然想到:如果你的理论成立吗?
ggplot(df,aes(x=weeks,y=value))+geom\u-line()+geom\u-vline(xintercept=0,color=“blue”,linetype=2)+facet\u-grid(if-else(is\u-manual,“manual”,“Uploaded”)~)
显示了同样的错误?在这种情况下,垂直线在刻面之前绘制。谢谢。我认为
facet\u grid
语句在序列中的位置并不重要,因为在生成几何体之前,数据必须按facet分割。只有geom订单才重要。对于可能感兴趣的人,我已经在GitHub上打开了一个。
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)