ggplot:根据条件填充颜色

时间:2021-01-11 22:54:08

标签: r ggplot2 colors

我想绘制两个分类变量(组、条件)和一个数值变量(值)。另外,我想根据值的重要性来填充颜色(重要的条应该是灰色的,其余的应该是白色的)。但是,在以下代码中,只有一些重要的条形显示为灰色。

plot <-  ggplot(dat, aes(group, value))+ 
  geom_col(aes(fill = condition), position = position_dodge(0.8), width = .7, color= "black") + 
   scale_fill_manual(values = ifelse(dat$significance > .05, "white", "grey")) + 
  geom_linerange(aes(group = condition,  ymin = ci_lower, ymax= ci_upper), position = position_dodge(0.8)) +
  coord_flip(ylim =c(-.2,1)) 
plot

这是我的数据:

dat <-  structure(list(group = c("friends", "parent", "esm", "friends", "parent", "esm"), 
                       value = c(0.25, 0.44, 0.33, 0.47, 0.25, 0.32), 
                       significance = c(0.08, 0, 0, 0, 0.01, 0), 
                       condition = c("S1", "S1", "S1", "S2", "S2", "S2"), 
                       trait = c("E", "E", "E", "E", "E", "E"), 
                       ci_lower = c(0.52, 0.74, 0.53, 0.67, 0.44, 0.49), 
                       ci_upper = c(-0.03, 0.14, 0.14, 0.27, 0.06, 0.15)),
                  row.names = c(1L,2L, 3L, 16L, 17L, 18L), class = "data.frame")

2 个答案:

答案 0 :(得分:2)

它也很有用:

library(ggplot2)
#Code
ggplot(dat, aes(group, value))+ 
  geom_col(aes(fill = interaction(condition,significance > .05)), 
           position = position_dodge(0.8), width = .7, color= "black") + 
  scale_fill_manual(values = c("grey","grey","white"),
                    breaks = c('S2.FALSE','S1.TRUE'),
                    labels=c('S2','S1')) + 
  geom_linerange(aes(group = condition,  ymin = ci_lower, ymax= ci_upper), position = position_dodge(0.8)) +
  coord_flip(ylim =c(-.2,1))+
  labs(fill='Var')

输出:

enter image description here

答案 1 :(得分:1)

您可以添加内联 mutate 以创建列以根据重要性指定颜色组。这里的关键是使用 group 美感,以便仍然可以根据 condition 变量对条形进行躲避和正确定位。

dat %>%
  mutate(sig = significance < .05) %>%
  ggplot(aes(group, value, group = condition)) +
  geom_col(
    aes(fill = sig),
    position = position_dodge(0.8),
    color = "black",
    width = .7
  ) +
  scale_fill_manual(values = c("white", "grey")) +
  geom_linerange(aes(ymin = ci_lower, ymax = ci_upper),
                 position = position_dodge(0.8)) +
  coord_flip(ylim = c(-.2, 1))

给出这个情节:

enter image description here

但是,我认为除了重要性之外,您还需要另一种审美来区分 condition。颜色是一种选择,但这是使用 ggpattern 的好地方,它会比轮廓颜色更明显并保持黑白外观。

这是一个例子:

library(ggpattern)

dat %>%
  mutate(sig = significance > .05) %>%
  ggplot(aes(group, value, group = condition)) +
  geom_col_pattern(
    aes(fill = sig, pattern_angle = condition),
    position = position_dodge(0.8),
    pattern_fill = "black",
    pattern_spacing = 0.025,
    pattern = "stripe",
    width = .7,
    color = "black"
  ) +
  scale_pattern_angle_discrete(range = c(45, 135)) +
  scale_fill_manual(values = c("grey", "white")) +
  geom_linerange(aes(ymin = ci_lower, ymax = ci_upper),
                 position = position_dodge(0.8)) +
  coord_flip(ylim = c(-.2, 1))

这给出了这个情节:

with ggpattern

最后,值得注意的是,条形的颜色通常不用于表示统计指标的重要性;更常见的约定是使用星号来表示相关的 p 值阈值(例如 ** p < 0.01)或使用字母来表示分组分析(例如方差分析)中的成员资格。这些可以使用 ggpubr 包轻松实现。这将使填充颜色自由以指示按 condition 分组。