#r #ggplot2 #boxplot
#r #ggplot2 #коробочный график
Вопрос:
Я искал везде, чтобы узнать, как использовать ggplot boxplots с 2 осями y.
Я хочу, чтобы график выглядел так:
Пример данных:
Sample Tumor Score_1 Score_2
1 A 100 -20
2 B 80 -10
3 C 5 -5
4 C 6 -7
5 C 80 -8
6 C 70 -30
7 C 80 -5
8 C 90 -6
9 A 150 -8
10 B 1 -10
11 B 2 -10
12 B 4 -9
13 B 5 -7
14 B 8 -6
15 B 10 -4
16 B 12 -8
17 B 7 -10
18 B 6 -11
19 C 70 -15
20 C 90 -4
21 C 95 -3
22 C 120 -6
23 C 130 -9
24 C 50 -5
25 C 113 -10
26 C 100 -2
27 C 90 -1
28 C 50 -11
29 C 80 -15
30 A 200 -7
31 A 200 -4
32 A 180 -3
33 A 160 -9
34 A 107 -15
35 A 115 -11
36 A 80 -12
37 A 90 -14
38 A 130 -13
39 A 140 -9
40 A 120 -10
myboxplot <- read.csv("Example.csv")
#Set up labels
ylim.prim <- c(0, 500)
ylim.sec <- c(-35, 0)
b <- diff(ylim.prim)/diff(ylim.sec)
a <- b*(ylim.prim[1] - ylim.sec[1])
myboxplot %>%
pivot_longer(cols = c(Score_1, Score_2)) %>%
mutate(name = factor(name, levels = c("Score_1", "Score_2"))) %>%
ggplot(aes(x = Tumor))
geom_boxplot(aes(y = value, fill = name))
scale_y_continuous(name ="Score 1", sec.axis = sec_axis(~ ((. - a)/b), name = expression("Score 2")))
scale_x_discrete(name = "Tumor")
theme_bw()
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank())
theme(plot.title = element_text(size = 14, face = "bold"),
text = element_text(size = 12),
#axis.title = element_text(face="bold"),
axis.text.x=element_text(size = 11),
legend.position = "right")
scale_fill_manual(values = wes_palette("GrandBudapest2"))
Я получаю график на изображении (ссылка выше), проблема в том, что мой второй набор данных (фиолетовые блок-графики «Оценка 2») не выравнивается по второй оси y, он выравнивается по первой оси y. Поскольку объем данных намного меньше, с диапазоном от -35 до 0, вы не видите разницы между типами опухолей. У кого-нибудь есть идеи, как это изменить?
Заранее благодарю вас!
Комментарии:
1. Ха-ха, ваша проблема — прекрасное доказательство того, почему я ненавижу ggplot2. Просто используйте базовый график.
boxplot()
далее следуетaxis(4,...)
. Проблема решена. Вместо этого вы просто написали около 12 строк кода ggplot, и это все равно не работает … потому что ggplot2 нелеп.
Ответ №1:
Я думаю, что запрашиваемый вами график может вводить в заблуждение. Вместо этого, как насчет фасета?
library(tidyverse)
data %>%
pivot_longer(-c("Sample","Tumor"), names_to = "Score") %>%
ggplot(aes( x= Tumor, y = value, fill = Score))
geom_boxplot()
facet_wrap(.~Score, scales = "free")
Или, как предлагает @NickCox:
data %>%
pivot_longer(-c("Sample","Tumor"), names_to = "Score") %>%
group_by(Score,Tumor) %>%
arrange(value) %>%
mutate(xcoord = seq(-0.25,0.25,length.out = n()),
Tumor = factor(Tumor)) %>%
ggplot(aes( x= Tumor, y = value, fill = Score))
geom_boxplot(outlier.shape = NA, coef = 0)
geom_point(aes(x = xcoord as.integer(Tumor)))
facet_wrap(.~Score, scales = "free")
Комментарии:
1. Это тоже было бы моим основным комментарием. Другой комментарий заключается в том, что исходные данные часто округляются таким образом, что коробочные графики не могут соответствовать действительности. Возможно, округление — это просто вопрос правил измерения или отчетности или избежание ложной точности, но читателю должно быть позволено это увидеть.
2. Ваш дополнительный код не совсем выполняет квантильный блок в стиле Парзена. Горизонтальная протяженность каждого блока в принципе покрывает 50% диапазона. Следовательно, квартили отображаются или должны отображаться в верхнем правом и нижнем левом углах блока. Детали напечатаны мелким шрифтом. Но для интерпретации. ваш дизайн и мой на практике достаточно похожи для большинства целей, или я так полагаю.
3. Большое спасибо @Ian, в итоге я просто использовал facet_wrap
Ответ №2:
[Это было опубликовано, когда вопрос находился на перекрестной проверке]
Коробочные графики я нахожу перепроданными всякий раз, когда, как обычно, есть возможность показать больше деталей. Вот одна из нескольких возможностей, график квантильного блока в смысле Парзена, в котором для каждой группы стандартный блок, показывающий медиану и квартили, накладывается на график квантилей, в котором неявная горизонтальная ось является порядком ранга. Деталь, что, кроме некоторых небольших целых чисел, многие значения кратны 10, представляет интерес и должна немного помочь в интерпретации.
На этом графике не используется R. Люди, использующие R, должны найти, что делать что-то похожее или лучше, тривиально — и те, чье любимое программное обеспечение отличается, должны иметь возможность сказать то же самое. Если нет, вам нужно новое любимое программное обеспечение.