блок-графики ggplot с 2 осями y

#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, должны найти, что делать что-то похожее или лучше, тривиально — и те, чье любимое программное обеспечение отличается, должны иметь возможность сказать то же самое. Если нет, вам нужно новое любимое программное обеспечение.