функция ggarrange () переопределяет цвет моих коробочных графиков

#r #ggplot2

#r #ggplot2

Вопрос:

Я создаю два коробочных графика и хочу расположить их рядом друг с другом. Я сделал так, чтобы каждый из них выглядел так, как я хочу, при их отображении по отдельности, но когда я использую 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("ACnN=38", "SqCCnN=15", "SCLCnN=8", "BL diseasenN=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-IIInN=24", "Stage IVnN=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")
  

Благодарен за любые советы!

Комментарии:

1. Не могли бы вы, пожалуйста, dput(BOX1_data ) и dput(BOX2_data ) вставить результат в вопрос, чтобы помочь вам!

2. Я добавил dput() в вопрос. 🙂

3. Хм. Насколько я понимаю, ваш код работает нормально. При использовании ggarrange цвета не исчезают. С использованием ggplot2 3.3.2 и ggpubr 0.4.0.

4. Ага! Я использовал ggplot2 3.3.0… Это сработало, когда я переустановил его в новую версию. Спасибо! Теперь проблема только в том, что я хочу, чтобы палитра продолжалась на полях второго графика, а не перезапускалась, чтобы я получал разные цвета на всех полях.

Ответ №1:

Как уже указывалось, похоже, проблема операционной системы с theme_set() удалением цветов заливки, установленных на ваших двух графиках, была решена путем обновления до новой версии ggplot2 . Здесь у меня есть решение для второй части вопроса OP (это было разъяснено в комментариях). Представлено здесь для удобства:

Теперь проблема только в том, что я хочу, чтобы палитра продолжалась на полях второго графика, а не перезапускалась, чтобы я получал разные цвета на всех полях.

Для того, чтобы сделать это, нужно понимать, что существует 4 цвета заливки для первого графика BOX1plot и 2 цвета заливки для BOX2plot . Для BOX1plot мы хотим, чтобы цветовая палитра начиналась с первого цвета, но для BOX2plot мы хотим, чтобы палитра начиналась с 5-й последовательности цветов в палитре. Нет способа сделать это с помощью scale_*_brewer() функций, поэтому подход здесь будет заключаться в доступе к палитре Brewer из RcolorBrewer::brewer.pal() , а затем назначить, где начинать и заканчивать в этой последовательности, на основе количества уровней каждого фактора, используя scale_fill_manual() , чтобы просто установить значения цвета из извлеченной палитры Brewer color.

Вы можете просто «знать», что вам нужно «использовать цвета 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("ACnN=38", "SqCCnN=15", "SCLCnN=8", "BL diseasenN=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-IIInN=24", "Stage IVnN=37"))

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

введите описание изображения здесь

Комментарии:

1. Большое вам спасибо! Это было действительно здорово и решило мою проблему!

Ответ №2:

Если у вас возникли проблемы с ggarrange() , я бы предложил следующий подход, используя patchwork :

 library(ggplot2)
library(patchwork)

#Data format
BOX1_data$Diagnosis <- as.factor(BOX1_data$Diagnosis)
#Plot 1
BOX1plot <- ggplot(BOX1_data, aes(x=Diagnosis, y=No.Variants, fill= Diagnosis))   geom_boxplot()   
  scale_fill_brewer(palette = "Dark2")  
  scale_x_discrete(labels = c("ACnN=38", "SqCCnN=15", "SCLCnN=8", "BL diseasenN=16"))
#Data format
BOX2_data$Stage <- as.factor(BOX2_data$Stage)
#Plot 2
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-IIInN=24", "Stage IVnN=37"))

#Arrange plots
BOX1plot BOX2plot plot_annotation(tag_levels = 'A')
  

Вывод:

введите описание изображения здесь