每个变量嵌套 ggplot 直方图

Posted

技术标签:

【中文标题】每个变量嵌套 ggplot 直方图【英文标题】:Nest ggplot histograms per variable 【发布时间】:2021-11-30 11:37:33 【问题描述】:

我想创建一个数据框,在其中汇总观察次数、平均值和中位数等值,并且我想嵌套它的 ggplot 直方图。为此,我将使用 iris 数据集。

这是我的第一次尝试:

iris %>%
  pivot_longer(-Species, 
               names_to = "Vars", 
               values_to = "Values") %>%
  group_by(Vars) %>%
  summarise(obs = n(),
            mean = round(mean(Values),2),
            median = round(median(Values),2))

所以它给了我:

# A tibble: 4 x 4
  Vars           obs  mean median
  <chr>        <int> <dbl>  <dbl>
1 Petal.Length   150  3.76   4.35
2 Petal.Width    150  1.2    1.3 
3 Sepal.Length   150  5.84   5.8 
4 Sepal.Width    150  3.06   3   

这是预期的表格:

# A tibble: 4 x 5
  Vars           obs  mean median plot
  <chr>        <int> <dbl>  <dbl> <list>
1 Petal.Length   150  3.76   4.35 <gg>
2 Petal.Width    150  1.2    1.3  <gg>
3 Sepal.Length   150  5.84   5.8  <gg>
4 Sepal.Width    150  3.06   3    <gg>

这是我尝试过的:

iris %>%
  pivot_longer(-Species, 
               names_to = "Vars", 
               values_to = "Values") %>%
  group_by(Vars) %>%
  nest() %>%
  mutate(metrics = lapply(data, function(df) df %>% summarise(obs = n(), mean = mean(Values), median = median(Values))),
         plots = lapply(data, function(df) df %>% ggplot(aes(Values)) + geom_histogram()))

差不多了,我看到了:

# A tibble: 4 x 4
# Groups:   Vars [4]
  Vars         data               metrics          plots 
  <chr>        <list>             <list>           <list>
1 Sepal.Length <tibble [150 × 2]> <tibble [1 × 3]> <gg>  
2 Sepal.Width  <tibble [150 × 2]> <tibble [1 × 3]> <gg>  
3 Petal.Length <tibble [150 × 2]> <tibble [1 × 3]> <gg>  
4 Petal.Width  <tibble [150 × 2]> <tibble [1 × 3]> <gg>  

但我不知道如何使用 obs、mean、median 和 plots 列来查看预期的 tibble,而没有 data 和 metrics 列。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我们可以在summarise 中使用cur_data() 并通过包装获得list 中的输出

library(dplyr)
library(ggplot2)
library(tidyr)
out <- iris %>%
  pivot_longer(-Species, 
               names_to = "Vars", 
               values_to = "Values") %>%
  group_by(Vars) %>%
  summarise(obs = n(),
            mean = round(mean(Values),2),
            median = round(median(Values),2), 
    plots = list(ggplot(cur_data(), aes(Values)) + geom_histogram()))

-输出

out
# A tibble: 4 × 5
  Vars           obs  mean median plots 
  <chr>        <int> <dbl>  <dbl> <list>
1 Petal.Length   150  3.76   4.35 <gg>  
2 Petal.Width    150  1.2    1.3  <gg>  
3 Sepal.Length   150  5.84   5.8  <gg>  
4 Sepal.Width    150  3.06   3    <gg>  

【讨论】:

根据文档,cur_data() 给出了当前组的当前数据。我不知道那个功能,非常感谢@akrun!祝你有美好的一天! 顺便说一句,我使用巢的方法有点复杂,不是吗? @Alexis 使用nest_by,您可以获得相同的输出,但随后必须提取那些obsmeanmedian 嗨@akrun,我想学习如何提取这些值。我想我会在这个问题上发布另一个问题。感谢您花时间和耐心回答这个疑问!

以上是关于每个变量嵌套 ggplot 直方图的主要内容,如果未能解决你的问题,请参考以下文章

用ggplot2直方图中另一个连续变量的平均值填充条形颜色

R语言ggplot2可视化:可视化人口金字塔图直方图(堆叠直方图连续变量堆叠直方图离散变量堆叠直方图)密度图箱图(添加抖动数据点tufte箱图多分类变量分组箱图)小提琴图

R语言ggplot2可视化:可视化堆叠的直方图添加每个分组的每个bin的计数标签在堆叠直方图的bin中的每个分组部分添加数值标签

R语言ggplot2可视化:可视化堆叠的直方图在bin中的每个分组部分添加数值标签为堆叠直方图中的每个分组部分添加数值标签

为 R 中的 facet_wrap 直方图的每个图分配自定义颜色 - ggplot

R语言ggplot2可视化:可视化连续(数值)变量的堆叠的直方图自定义堆叠直方图中不同分组条形的色彩自定义直方图bin的个数(Histogram for Continuous Variable)