首页 文章

在ggplot2中将堆栈和闪避与条形图结合起来

提问于
浏览
4

我试图在没有可怕的3D条形图和不清楚的x轴(这些是不同的时间点并且很难分辨它们的时候)重新创建这个情节 .

Bad plot

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

我的第一直觉是做一些类似于他们所做的事情,使用2d条形图和不同的x轴标签,使用躲避的条形作为基因型,然后堆叠条形以获得前栏上的黑白分割,但其他一些好处这里的问题说你做不到 .

我的下一个方法是使用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

    回复你的评论:这是一种hacky方式,可以单独堆叠 Ancestral genotype 然后躲避每一对 . 我们分别为 mutS-mutS+ 绘制堆积的条形图,并通过在相反的方向上移动少量的数据来手动躲避条形图 . 将条 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视角引起的失真,还因为它产生了错误的外观,每个测量都以相同的时间间隔分开 .

相关问题