带有 2 个 y 轴的 ggplot 箱线图

ggplot boxplots with 2 y axes

我到处寻找如何使用 2 个 y 轴绘制箱线图。

这就是我想要的情节:

boxplot

示例数据:

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"))

我确实得到了图像中的图(上面链接),问题是我的第二组数据(紫色箱线图“Score 2”)没有与第二个 y 轴对齐,而是与第一个 y 轴。由于数据小得多,范围为 -35 到 0,因此您看不到肿瘤类型之间的差异。有谁知道如何更改此设置?

提前致谢!

我认为您要求的情节可能具有误导性。相反,一个方面怎么样?

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")

[这是在交叉验证问题时发布的]

我发现箱形图超卖,通常情况下,有显示更多细节的空间。这是几种可能性之一,Parzen 意义上的分位数箱图,其中对于每个组,一个显示中位数和四分位数的标准箱叠加在分位数图上,其中隐含的水平轴是等级顺序。除了一些小整数之外,许多值只是 10 的倍数的细节很有趣,应该有助于解释。

这个情节不使用 R。使用 R 的人应该发现做类似或更好的事情是微不足道的——而那些喜欢不同软件的人应该能够说出相同的事情。如果没有,你需要新的喜欢的软件。