在一张图中简化多个箱线图

Posted

技术标签:

【中文标题】在一张图中简化多个箱线图【英文标题】:Simplify multiple boxplots in one graph 【发布时间】:2020-12-03 13:26:36 【问题描述】:

我有一个包含 17 个问题 (Q1 - Q17) 和一个分类变量 (Region) 的数据集。

> df[, c("Region", QUESTIONS)]
# A tibble: 963 x 18
   Region     Q1    Q2    Q3    Q4    Q5    Q6    Q7    Q8    Q9   Q10   Q11   Q12   Q13   Q14   Q15
   <chr>   <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
 1 USA         0     1     0     0     0     0     0     0     0     0     0     0     0     0     0
 2 USA         8     8     8     8     6     8     8     0     5    10     7     0     0    10     8
 3 USA         9     8     7    10     8     4     8     0     5     8     8     8     2     7     6
 4 USA         4     2     5     4     3     3     2     0     1     0     0     0     3     2     0
 5 USA         2     6     7     5     6     2     9     0     6     7     3     0     0     8     5
 6 USA         6     6     8     1     2     0     4     0     0     4     0     6    10     0     1
 7 USA         5     2     7     8    10     9    10     8     6    10     1    10     4     6    10
 8 IE          6     6     5     5     6     5     6     3     6     7     6     6     7     7     4
 9 OCEANIA     8     8     6    10     5    10     5     1    10     4     0     1    10     9    10
10 USA         3     2     2     7     3     1     2     0     8     3     3     1     0     8     8
# ... with 953 more rows, and 2 more variables: Q16 <int>, Q17 <int>

我想跨区域比较答案,所以我先融化 df,然后使用 ggplot 创建一个箱线图。

df1 ggplot(data=df1, aes(x=variable, y=value, fill=Region)) + geom_boxplot()

不幸的是,有 17 个问题和 13 个区域,箱线图非常繁忙,几乎无法理解。我怎样才能简化它(比如只绘制平均值和 +/-1 标​​准误差)以便它清晰易读。或者,我如何生成 17 组箱线图(每个问题一个,并且我确实需要所有 17 个问题),每个箱线图的 13 个区域都是可见的?

真诚的

托马斯·飞利浦

【问题讨论】:

【参考方案1】:

您可能想使用facet_wrap()。这里我用一些简化的假数据来给你思路。

library(dplyr)
library(tidyr)
library(ggplot2)
set.seed(12234)
df <- data.frame(Region = sample(LETTERS[1:10], 100, TRUE),
                 Q1 = rpois(100, 4),
                 Q2 = rpois(100, 3),
                 Q3 = round(runif(100, 1, 10)),
                 Q4 = round(runif(100, 1, 10)),
                 Q5 = round(10 * rnorm(100)))
df %>% pivot_longer(cols = -Region, names_to = "Question", values_to = "Value") %>%
  ggplot() +
  geom_boxplot(aes(x = Region, y = Value, fill = Region)) + 
  facet_wrap("Question")

【讨论】:

您可以使用facet_wrap()nrowncol 参数来控制绘图的排列方式。 这太棒了 - 谢谢。我不知道 facet_wrap() 和 facet_grid()。我现在正在为最后一件事苦苦挣扎 - 对图进行排序:有 17 个问题,我希望看到按顺序排列的图,即 Q1、Q2、.Q3 ..... 相反,它们是按字典顺序排列的,即 Q1、Q10、Q11 ,...Q17,Q2,Q3,...,Q9。我尝试对我的数据框进行排序并查看了各种文档和博客文章,但未能解决这个问题。麻烦您指点一下解决方案吗? 解决了 - 我必须将 Q1,....Q17 定义为一个因素。现在就像一个魅力。再次感谢!

以上是关于在一张图中简化多个箱线图的主要内容,如果未能解决你的问题,请参考以下文章

在一张图表ggplot R上结合散点图、箱线图和线性回归线

通过箱线图判断偏向

具有多个类别的箱线图和小提琴图

如何在单个图中获取每个类别的箱线图

更改熊猫箱线图子图中各个框的颜色

利用箱线图过滤数据