如何将tibble元素映射到ggplot2美学?

3
我有以下数据集。
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。
附注:我不确定如何表达问题,欢迎任何建议。
2个回答

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)

enter image description here


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)

+1 因为这几乎与我所做的非常接近,但不太具有普适性。例如,使用 replace = F 就不可能在两个不同的图中出现相同的值。相反,我可能想要在同一图中使用 replace=F,但在不同的图之间不使用。 - Dambo
哦,我明白了。您可以多次调用sample并将结果连接起来。 dist <- rnorm(1000); samples <- c(sample(dist,3), sample(dist,10), sample(dist,100)); - csgroen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接