在一张图中简化多个箱线图
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()
的nrow
或ncol
参数来控制绘图的排列方式。
这太棒了 - 谢谢。我不知道 facet_wrap() 和 facet_grid()。我现在正在为最后一件事苦苦挣扎 - 对图进行排序:有 17 个问题,我希望看到按顺序排列的图,即 Q1、Q2、.Q3 ..... 相反,它们是按字典顺序排列的,即 Q1、Q10、Q11 ,...Q17,Q2,Q3,...,Q9。我尝试对我的数据框进行排序并查看了各种文档和博客文章,但未能解决这个问题。麻烦您指点一下解决方案吗?
解决了 - 我必须将 Q1,....Q17 定义为一个因素。现在就像一个魅力。再次感谢!以上是关于在一张图中简化多个箱线图的主要内容,如果未能解决你的问题,请参考以下文章