首页 > 解决方案 > ggarrange() 函数覆盖了我的箱线图的颜色

问题描述

我正在制作两个箱线图,并希望将它们排列在一起。我在单独显示它们时使它们看起来像我想要的,但是当我使用ggarrange()时,颜色会消失。这是我的情节代码:

BOX1_data <- read.table(file = "clipboard", 
                      sep = "\t", header=TRUE)
BOX1_data$Diagnosis <- as.factor(BOX1_data$Diagnosis)
BOX1plot <- ggplot(BOX1_data, aes(x=Diagnosis, y=No.Variants, fill= Diagnosis)) + geom_boxplot() + 
    scale_fill_brewer(palette = "Dark2") +
    scale_x_discrete(labels = c("AC\nN=38", "SqCC\nN=15", "SCLC\nN=8", "BL disease\nN=16"))

BOX2_data <- read.table(file = "clipboard", 
                     sep = "\t", header=TRUE)
BOX2_data$Stage <- as.factor(BOX2_data$Stage)
BOX2plot <- ggplot(BOX2_data, aes(x=Stage, y=No.Variants, fill = Stage))    + geom_boxplot(width = 0.4) + 
    scale_fill_brewer(palette = "Dark2") + 
    scale_x_discrete(labels = c("Stage I-III\nN=24", "Stage IV\nN=37"))

为了安排情节,我然后写:

BOX_list <- list(BOX1plot, BOX2plot)
ggarrange(plotlist = BOX_list, labels = c('A', 'B'), ncol = 2)

我认为摆脱网格线等的最简单方法是使用 theme_set() ,我认为这可能是我的问题。我的代码是:

theme_set(theme_bw() + theme(panel.border = element_blank(), panel.grid.major = element_blank(),
                    panel.grid.minor = element_blank(), panel.background = element_blank(), 
                    axis.line = element_line(colour = "grey")))

我意识到theme_bw() 会覆盖我在框中的颜色。但是我尝试将其删除,将其切换为theme_transparent()(这会删除我所有的标签),但都不起作用。我一直在寻找一种方法,只需在主题中的框上添加透明度,以便我的颜色会发光。我也怀疑,也许我选择的调色板可能会在两个图中给我相同的颜色,而我也不想要。补充一点,如果重要的话,我在第一个情节中有 4 个组,在第二个情节中有 2 个。

dput(BOX1_data)
structure(list(Diagnosis = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("1", "2", "3", "4"), class = "factor"), 
    No.Variants = c(3L, 4L, 6L, 14L, 3L, 3L, 4L, 3L, 3L, 3L, 
    8L, 6L, 22L, 10L, 6L, 9L, 1L, 9L, 3L, 4L, 8L, 2L, 13L, 3L, 
    11L, 19L, 5L, 5L, 3L, 12L, 4L, 2L, 4L, 18L, 8L, 7L, 7L, 12L, 
    4L, 1L, 6L, 3L, 2L, 8L, 10L, 3L, 15L, 9L, 13L, 13L, 15L, 
    10L, 10L, 12L, 6L, 3L, 12L, 9L, 15L, 10L, 18L, 3L, 6L, 3L, 
    6L, 1L, 3L, 3L, 7L, 1L, 2L, 10L, 7L, 7L, 1L, 0L, 2L)), row.names = c(NA, 
-77L), class = "data.frame")
dput(BOX2_data)
structure(list(No.Variants = c(3L, 4L, 6L, 14L, 3L, 3L, 4L, 3L, 
3L, 3L, 8L, 6L, 22L, 10L, 6L, 9L, 1L, 9L, 3L, 4L, 8L, 2L, 13L, 
3L, 11L, 19L, 5L, 5L, 3L, 12L, 4L, 2L, 4L, 18L, 8L, 7L, 7L, 12L, 
4L, 1L, 6L, 3L, 2L, 8L, 10L, 3L, 15L, 9L, 13L, 13L, 15L, 10L, 
10L, 12L, 6L, 3L, 12L, 9L, 15L, 10L, 18L), Stage = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("1", 
"2"), class = "factor")), row.names = c(NA, -61L), class = "data.frame")

感谢任何提示!

标签: rggplot2

解决方案


正如已经指出的那样,似乎 OPtheme_set()删除两个图中设置的填充颜色的问题已通过更新到新版本的ggplot2. 在这里,我对 OP 问题的第二部分有一个解决方案(在评论中已澄清)。为方便起见,此处表示:

现在只是我希望调色板继续在第二个绘图的盒子上而不是重新启动的问题,这样我就会在所有盒子上得到不同的颜色。

为了做到这一点,必须意识到第一个 plot 有 4 种BOX1plot填充颜色,而BOX2plot. 对于BOX1plot,我们希望调色板从第一个颜色开始,但是对于BOX2plot,我们希望调色板从调色板中的第 5 个颜色序列开始。无法通过scale_*_brewer()函数执行此操作,因此此处的方法是从 访问 Brewer 调色板RcolorBrewer::brewer.pal(),然后根据每个因子的级别数指定在该序列中的开始和结束位置,用于scale_fill_manual()设置颜色值从提取的 Brewer 调色板中。

您只需“知道”您需要“使用颜色 1-4”BOX1plot和“使用颜色 5 和 6”即可BOX2plot;但是,仅根据级别数自动计算它会更加优雅(以防您想再次运行它)。下面的代码执行此操作:

library(ggplot2)
library(ggpubr)
library(RColorBrewer)

# ... read in your data as before

# create factors (as OP did before)
BOX1_data$Diagnosis <- as.factor(BOX1_data$Diagnosis)
BOX2_data$Stage <- as.factor(BOX2_data$Stage)

# make color palette based on Brewer "Dark2" palette
lev_diag <- length(levels(BOX1_data$Diagnosis))
lev_stage <- length(levels(BOX2_data$Stage))
lev_total <- lev_diag + lev_stage
my_colors <- brewer.pal(lev_total, "Dark2")

BOX1plot <- ggplot(BOX1_data, aes(x=Diagnosis, y=No.Variants, fill= Diagnosis)) + geom_boxplot() + 
  scale_fill_manual(values=my_colors[1:lev_diag]) +
  scale_x_discrete(labels = c("AC\nN=38", "SqCC\nN=15", "SCLC\nN=8", "BL disease\nN=16"))

BOX2plot <- ggplot(BOX2_data, aes(x=Stage, y=No.Variants, fill = Stage))    + geom_boxplot(width = 0.4) + 
  scale_fill_manual(values = my_colors[(lev_diag+1):lev_total]) +
  scale_x_discrete(labels = c("Stage I-III\nN=24", "Stage IV\nN=37"))

BOX_list <- list(BOX1plot, BOX2plot)
ggarrange(plotlist = BOX_list, labels = c('A', 'B'), ncol = 2)

在此处输入图像描述


推荐阅读