【问题标题】:Combine stack and dodge with bar plot in ggplot2将堆栈和闪避与ggplot2中的条形图结合起来
【发布时间】:2017-09-03 00:37:33
【问题描述】:

我正在尝试在没有可怕的 3d 条形图和不清楚的 x 轴的情况下重新创建这个图(这些是不同的时间点,很难分辨它们何时是)。

(from Science 291, no. 5513 (2001): 2606–8, otherwise a good paper.)

我的第一直觉是做一些类似于他们所做的事情,使用 2d 条形图和不同的 x 轴标签,使用闪避的条形表示基因型,然后堆叠条形在前面的条形上得到黑白分割,但是这里还有几个很好的问题表明你不能这样做。

我的下一个方法是使用 faceting(下面的代码),它工作得相当好,但我很想看到一个更好的方法来做到这一点。有没有办法堆叠一些变量并控制其他变量?或者只是一个更好的方法来做到这一点?

编辑:澄清一下,我认为显示堆叠条的总数很重要(在这种情况下,m 和 n,最初是黑色和白色),因为这代表一个测量的数量,然后拆分是一个单独的测量。

library(tidyverse)
library(cowplot)

data = tribble(
  ~Timepoint, ~`Ancestral genotype`, ~Mutator, ~`Mean % of auxotrophs`,
  100, 'mutS-', 'o', 10.5,
  150, 'mutS-', 'o', 16,
  220, 'mutS-', 'o', NA,
  300, 'mutS-', 'o', 24.5,
  100, 'mutS+', 'n', 1,
  150, 'mutS+', 'n', NA,
  220, 'mutS+', 'n', 1,
  300, 'mutS+', 'n', 1,
  100, 'mutS+', 'm', 0,
  150, 'mutS+', 'm', NA,
  220, 'mutS+', 'm', 2,
  300, 'mutS+', 'm', 5
)

data <- data %>% mutate(Timepoint = as.character(Timepoint))

data %>% ggplot(aes(x = Timepoint, y = `Mean % of auxotrophs`)) +
  geom_col(aes(fill = Mutator), position = 'stack') + facet_grid(~`Ancestral genotype` ) +
  guides(fill=FALSE)

【问题讨论】:

    标签: r plot ggplot2 bar-chart


    【解决方案1】:

    在我看来,线图在这里更直观:

     library(forcats)
    
     data %>% 
       filter(!is.na(`Mean % of auxotrophs`)) %>%
       ggplot(aes(x = Timepoint, y = `Mean % of auxotrophs`, 
                  color = fct_relevel(Mutator, c("o","m","n")), linetype=`Ancestral genotype`)) +
       geom_line() +
       geom_point(size=4) + 
       labs(linetype="Ancestral\ngenotype", colour="Mutator")
    

    回复您的评论:这是一种通过Ancestral genotype 分别堆叠然后躲避每一对的黑客方法。我们分别为mutS-mutS+ 绘制堆叠条形图,并通过在相反方向上少量移动Timepoint 手动躲避条形图。将条形 width 设置为移位量的两倍将导致成对的条形相互接触。我添加了少量的额外移位(5.5 而不是 5),以在每对的两个条之间创建少量空间。

     ggplot() +
       geom_col(data=data %>% filter(`Ancestral genotype`=="mutS+"),
                aes(x = Timepoint + 5.5, y = `Mean % of auxotrophs`, fill=Mutator),
                width=10, colour="grey40", size=0.4) + 
       geom_col(data=data %>% filter(`Ancestral genotype`=="mutS-"),
                aes(x = Timepoint - 5.5, y = `Mean % of auxotrophs`, fill=Mutator), 
                width=10, colour="grey40", size=0.4) + 
       scale_fill_discrete(drop=FALSE) +
       scale_y_continuous(limits=c(0,26), expand=c(0,0)) +
       labs(x="Timepoint")
    

    注意:在上面的两个示例中,我将 Timepoint 保留为数字变量(即,我跳过了将其转换为字符的步骤)以确保 x 轴以时间为单位单位,而不是将其转换为分类轴。 3D 绘图是可憎的,不仅因为 3D 透视造成的失真,还因为它造成了每次测量被相同的时间间隔分开的假象。

    【讨论】:

    • 谢谢。这是一个很好的方法。唯一的一点是,我认为重要的是要证明 mutS+ 菌株中的 n 和 o 类型与分离的 mutS- 类型相比实际上来自相同的文化,这就是为什么我认为堆叠条是有意义的。 (不过从图中看不是很明显。)
    • 有没有办法将 x 变量作为一个因素来做到这一点?
    • 第一个情节还是第二个情节?
    猜你喜欢
    • 2012-09-24
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多