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

时间:2017-08-22 21:24:11

标签: r ggplot2 purrr

我有以下数据集

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:我不确定如何质疑任何欢迎任何建议的问题

2 个答案:

答案 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)

enter image description here

答案 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)