来自具有多个组的分位数的数据框的箱线图

box plot from a dataframe with quantiles for multiple groups

我有一个数据框 df 如下。

df <- data.frame(test = c("Test1", "Test2", "Test1", "Test2"),
                 group = c("A", "A", "B", "B"),
                 varC5th = c(2, 3, 1, 5),
                 varC25th = c(20, 30, 10, 50),
                 varC50th = c(25, 35, 15, 55),
                 varC75th = c(35, 45, 25, 75),
                 varC95th = c(65, 75, 55, 105),
                 varD5th = c(0.2, 0.8, 0.6, 0.4),
                 varD25th = c(2, 8, 6, 4),
                 varD50th = c(3, 9, 7, 5),
                 varD75th = c(5, 11, 9, 7),
                 varD95th = c(9, 15, 13, 11)
                 )

使用 dfggplot 我需要绘制 varCvarD 的箱线图,其中给定的五个分位数值(varX5th ... varX95th)由test 两组 A & B.

我尝试了什么

我到了某个程度,我可以得到一组的箱线图,其中值在 aes 中传递,如下所示。

ggplot(df[1,], 
       aes(x=group, ymin = varC5th, lower = varC25th,
           middle = varC50th, upper = varC75th, ymax = varC95th)) + geom_boxplot(stat = "identity")

这给出了如下图 - 我需要帮助包括所有 groups 和 test 分面,以便可以在一张图表中看到两个测试的图。另外,我更喜欢在箱线图的两个端点都有水平线。

试试下面的方法:

ggplot(df, 
       aes(x = group, ymin = varC5th, lower = varC25th,
           middle = varC50th, upper = varC75th, ymax = varC95th)) +
  geom_boxplot(stat = "identity") +
  geom_errorbar() + 
  facet_grid(.~test)


编辑: 重读你的 post 后,我意识到你想要 4 个图,vartypeCD vs test12。为此,我们需要转换数据然后绘制:

library(ggplot2)
library(tidyr)
library(dplyr)

plotDat <-
  gather(df, key = "Key", value = "Value", -c(test, group)) %>% 
  mutate(varType = substr(Key, 1, 4),
         q = make.names(substr(Key, 5, 8))) %>% 
  select(-Key) %>% 
  spread(key = q, value = Value)

plotDat
#    test group varType X25th X50th X5th X75th X95th
# 1 Test1     A    varC    20    25  2.0    35    65
# 2 Test1     A    varD     2     3  0.2     5     9
# 3 Test1     B    varC    10    15  1.0    25    55
# 4 Test1     B    varD     6     7  0.6     9    13
# 5 Test2     A    varC    30    35  3.0    45    75
# 6 Test2     A    varD     8     9  0.8    11    15
# 7 Test2     B    varC    50    55  5.0    75   105
# 8 Test2     B    varD     4     5  0.4     7    11

# now let's plot
ggplot(plotDat, 
       aes(x = group, ymin = X5th, lower = X25th,
           middle = X50th, upper = X75th, ymax = X95th)) +
  geom_boxplot(stat = "identity") +
  geom_errorbar() + 
  facet_grid(varType ~ test, scale = "free_y")