r - 是否可以使用单个“geom_boxplot()”来对不带分面的分组部分箱线图进行ggplot?
问题描述
我需要在下面的图中添加一些部分箱线图:
library(tidyverse)
foo <- tibble(
time = 1:100,
group = sample(c("a", "b"), 100, replace = TRUE) %>% as.factor()
) %>%
group_by(group) %>%
mutate(value = rnorm(n()) + 10 * as.integer(group)) %>%
ungroup()
foo %>%
ggplot(aes(x = time, y = value, color = group)) +
geom_point() +
geom_smooth(se = FALSE)
我会在上面的图中添加一个(2 x 4 = 8)箱线图(每组 4 个)网格。每个箱线图应考虑连续选择 25(或 n)个点(在每组中)。即,前两个箱线图代表第一个和第 25 个之间的点(下面一个箱线图用于 a 组,一个箱线图用于 b 组)。在它们旁边,还有另外两个箱线图,用于 26 日和 50 日之间的点,等等。如果它们不是在一个完美的网格中(我认为这将更具挑战性和丑陋),那就更好了:我更喜欢它们是否会“遵循”它们相应的平滑线!
这一切都没有使用刻面(因为我必须将它们插入到已经刻面的情节中:-))
我试过了
bar <- foo %>%
group_by(group) %>%
mutate(cut = 12.5 * (time %/% 25)) %>%
ungroup()
bar %>%
ggplot(aes(x = time, y = value, color = group)) +
geom_point() +
geom_smooth(se = FALSE) +
geom_boxplot(aes(x = cut))
但它不起作用。
我尝试调用geom_boxplot()
usinggroup
而不是x
bar %>%
ggplot(aes(x = time, y = value, color = group)) +
geom_point() +
geom_smooth(se = FALSE) +
geom_boxplot(aes(group = cut))
但它在不考虑组的情况下绘制箱线图,甚至失去颜色(并添加冗余调用,包括color = group
无济于事)
最后,我决定粗略地尝试一下:
bar %>%
ggplot(aes(x = time, y = value, color = group)) +
geom_point() +
geom_smooth(se = FALSE) +
geom_boxplot(data = filter(bar, group == "a"), aes(group = cut)) +
geom_boxplot(data = filter(bar, group == "b"), aes(group = cut))
有人知道是否可以通过一次调用来获得它geom_boxplot()
?
谢谢!
解决方案
这很有趣!我之前没有尝试过使用geom_boxplot
连续的x
,也不知道它的表现如何。我认为正在发生的事情是设置group
覆盖colour
in geom_boxplot
,因此它不尊重继承或重复的colour
审美。我认为这种解决方法可以解决问题。我们将group
和cut
变量组合成group_cut
,它采用 8 个不同的值(每个所需的箱线图一个)。现在我们可以映射aes(group = group_cut)
并获得所需的输出。我认为这不是特别直观,它可能值得在 Github 上提出,因为通常我们希望美学能够很好地结合(例如结合colour
和linetype
工作正常)。
library(tidyverse)
bar <- tibble(
time = 1:100,
group = sample(c("a", "b"), 100, replace = TRUE) %>% as.factor()
) %>%
group_by(group) %>%
mutate(
value = rnorm(n()) + 10 * as.integer(group),
cut = 12.5 * ((time - 1) %/% 25), # modified this to prevent an extra boxplot
group_cut = str_c(group, cut)
) %>%
ungroup()
bar %>%
ggplot(aes(x = time, y = value, colour = group)) +
geom_point() +
geom_smooth(se = FALSE) +
geom_boxplot(aes(group = group_cut), position = "identity")
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
由reprex 包(v0.3.0)于 2019 年 8 月 13 日创建
推荐阅读
- php - Laravel:如何增加登录()功能?
- twitter-bootstrap - Bootstrap nav :转到下一行而不是推送导航的内容
- saxon - 如何注册 Saxon/XSLT 扩展函数以便它们可以在 BaseX/XQuery (JAXP API) 中访问
- java - Java 中的泛型二叉搜索树实现 - 调用泛型方法和强制转换异常
- html - 如何在 vaadin 标签上添加 html 格式?
- android - Delphi [PAClient 错误] 错误:E6409 无法打开文件
- php - 今天是太阳,正确的 CPU 时间。本地主机中的 PHP 显示 Mon
- python - 无法在 Python37 中安装 Flaskr
- python - 提取与另一个数据框列具有共同编号的数据框中的行并连接两行
- c++ - 我的代码的复杂性是什么?如何改进它?