我有以下数据集
map(.x = list(small = 3, medium = 10, large = 100) ,
.f = ~ sample(rnorm(1000), .x, replace = T)) %>%
tibble(sample = ., mean = map_dbl(., mean))
# A tibble: 3 x 2
sample mean
<list> <dbl>
1 <dbl [3]> 0.61473548
2 <dbl [10]> 0.17278357
3 <dbl [100]> 0.04156308
我正在尝试在ggplot2中为列sample
中的每个记录创建1个直方图。我想在同一网格中显示这些图,因此我认为我可以某种方式使用facet_wrap()
,但我不确定如何将美学映射到列表。
这是我到目前为止所尝试的:
map(.x = list(small = 3, medium = 10, large = 100) ,
.f = ~ sample(rnorm(1000), .x, replace = T)) %>%
tibble(sample = ., mean = map_dbl(., mean)) %>%
ggplot2::ggplot(data = .) + geom_histogram(mapping = aes(sample)) + facet_wrap(~ sample)
我期望的输出是3个直方图,分别有3,10和100个观测值。
我想知道一个可能的解决方案是否涉及将sample
拆分为两列:一列包含所有值,另一列表示每个值所属的分布大小。这可能更符合ggplot2逻辑,但我不确定如何相应地扩展tibble。
ps:我不确定如何质疑任何欢迎任何建议的问题
答案 0 :(得分:3)
我认为你需要tidyr::unnest
:
library(dplyr)
library(tidyr)
library(ggplot2)
## generate data
set.seed(123)
dtf <- map(.x = list(small = 3, medium = 10, large = 100),
.f = ~ sample(rnorm(1000), .x, replace = T)) %>%
tibble(sample = ., mean = map_dbl(., mean))
## plot
dtf %>%
mutate(group = names(sample)) %>% # or: group = lengths(sample)
unnest(sample) %>%
ggplot(data = .) +
geom_histogram(mapping = aes(sample)) +
facet_wrap(~ group)
答案 1 :(得分:1)
列表结构给你带来了麻烦。试试这个:
tibble(id = rep(c("small", "medium", "large"), c(3,10,100)),
samples = sample(rnorm(1000), 113, replace = T)) %>%
ggplot2::ggplot(data = .) +
geom_histogram(mapping = aes(samples)) + facet_wrap(~ id)