#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')
Вывод: