不能在带有位置参数的 ggplot 中使用条件 - 条件闪避

can not use conditions in ggplot with position arguments - conditional dodge

我想设置positon一些条件,但是当我使用if_else()时出现错误。

下面是一个可重现的例子。

我的问题是:

如何在 ggplot2 中使用 position 中的条件。

library(dplyr)

pd_ture = position_dodge(.4)
pd_false = position_dodge(.6)

mtcars_true = mtcars %>% mutate(test = TRUE)
mtcars_false =mtcars %>% mutate(test = FALSE)


ggplot(mtcars_true, aes(factor(cyl), fill = factor(vs))) +
  geom_bar(position = if_else(unique(mtcars_true$test), pd_ture, pd_false))

# Error in true[rep(NA_integer_, length(condition))] : 
#  object of type 'environment' is not subsettable

ggplot(mtcars_false, aes(factor(cyl), fill = factor(vs))) +
  geom_bar(position = if_else(unique(mtcars_false$test), pd_false, pd_ture))

# Error in true[rep(NA_integer_, length(condition))] : 
#  object of type 'environment' is not subsettable

我认为你做不到。 你想要的是这样的模式:

ggplot(mtcars_true, aes(factor(cyl), fill = factor(vs))) +
  geom_bar(data = . %>% filter(test), position = pd_ture) +
  geom_bar(data = . %>% filter(!test), position = pd_false)

但是您设置它的方式,mtcars_true/mt_cars_false 并不是真正为此而设计的。因此,要使当前设置正常工作,您需要:

ggplot(mtcars_true, aes(factor(cyl), fill = factor(vs))) +
  geom_bar(data = mtcars_true, position = pd_ture) +
  geom_bar(data = mtcars_false, position = pd_false)

但是 data = . %>% [data transforming pipes] 的模式将允许您对当前层/geom_* 正在馈送的数据的哪一部分进行子集化。

可以 这样做,但不能使用 if_elseifelse,因为它们会将子集运算符应用于 [=13= 的输出],这是不可子集化的。相反,你需要一个好的 old-fashioned if(unique(mtcars_true$test)) pd_ture else pd_false:

ggplot(mtcars_true, aes(factor(cyl), fill = factor(vs))) +
  geom_bar(position = if(unique(mtcars_true$test)) pd_ture else pd_false)