在ggplot2中将堆叠和分组条形图相结合

6

我正在尝试重新创建这个图表,但不想使用可怕的3D条形图和不清晰的X轴(这些是不同的时间点,很难确定它们的时间)。

Bad plot

(来自Science 291,第5513期(2001年):2606-8,除此之外是一篇很好的论文。)

我的第一反应是做类似于他们所做的事情,使用2D条形图和不同的x轴标签,对基因型使用dodged bars,然后使用堆积条形图在前面的条形图上获得黑白分割,但是这里有几个其他好问题说你不能这样做。

我的下一个方法是使用faceting(以下是代码),这个方法效果还不错,但我很想看到更好的方法来做这个。有没有一种方法可以将某些变量堆叠起来,而将其他变量闪避掉?或者只是一般做法更好吗?

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

This is my faceted version.

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)
1个回答

3

我认为在这里使用折线图更直观:

 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")

enter image description here

回应您的评论:以下是一种简单粗暴的方法,可以通过 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")

enter image description here

注意:在上面两个示例中,我将Timepoint保留为数字变量(即跳过了将其转换为字符的步骤),以确保x轴以时间单位命名,而不是将其转换为分类轴。 3D图是一种丑陋的图表,不仅因为由于3D透视而产生扭曲,还因为它会创建一个虚假的外观,即每个测量值之间的时间间隔相同。

谢谢。这是一个很好的方法。唯一的问题是,我认为展示mutS+菌株中的n和o类型实际上来自同一文化与mutS-类型分开是很重要的,这就是为什么我认为堆叠条形图是有意义的。(尽管从图中并不是非常明显。) - Jazz Weisman
有没有一种方法可以将x变量作为因子来处理? - masfenix
第一个图还是第二个? - eipi10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接