r - 将堆栈和闪避与 ggplot2 中的条形图相结合

标签 r plot ggplot2 bar-chart

我试图在没有可怕的 3d 条形图和不清晰的 x 轴的情况下重新创建这个图(这些是不同的时间点,很难说它们是什么时候)。

Bad plot

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

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

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

编辑:为了澄清,我认为显示堆叠条形的总数很重要(在本例中为 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)

最佳答案

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

 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 透视造成的失真,还因为它会造成每次测量间隔相同的时间间隔的假象。

关于r - 将堆栈和闪避与 ggplot2 中的条形图相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43281303/

相关文章:

r - 水平对齐图例ggplot2

r - 限制geom_line的x轴范围(由斜率和截距定义)

r - 如何使用 ggplot 在 R 中创建不均匀的 facet_wrap 网格?

r - 使用并行应用后如何保留数据框形式的列表

MCMCglmm 中的重复测量

plot - 使用 gnuplot 在柱坐标系中绘制方程

python - 向 python matplotlib 颜色条正确添加第二组刻度

matlab - 随着时间的推移绘制 3d 位置数据

r - 使用 RSQLite 和 bind.data 批量更新 R 中的 SQLite 列

r - 在 ggplot 中设置中断和标签