【问题标题】:ggplot2 plot raw data for rare subgroups and boxplots for common subgroupsggplot2 绘制罕见子组的原始数据和常见子组的箱线图
【发布时间】:2019-01-29 09:38:22
【问题描述】:

箱线图可以方便地总结连续数据,但是,用于稀有子组 (n

例子:

library(ggplot2)
p <- ggplot(mpg, aes(class, hwy))
p + geom_boxplot()

按每个类别(汽车类型)生成高速公路(连续)箱线图。但是,查看每个班级的频率,我们发现只有 5 辆 2 座和 11 辆小型货车。我希望查看原始数据(点,可能会抖动),而不是 2 座和小型货车的箱线图,但保留满足人为设置的最小样本量(例如 n = 20)的其他组的箱线图。

table(mpg$class)

   2seater    compact    midsize    minivan     pickup subcompact        suv       
         5         47         41         11         33         35         62  

【问题讨论】:

    标签: r ggplot2 boxplot


    【解决方案1】:

    这是如何做到的。您可以将值从 20 更改为您喜欢的任何值。

    # loading the needed libraries
    library(tidyverse)
    
    # adding a new column containing count information
    (mpg <- mpg %>%
        dplyr::group_by(.data = ., class) %>%
        dplyr::mutate(.data = ., n = dplyr::n()))
    #> # A tibble: 234 x 12
    #> # Groups:   class [7]
    #>    manufacturer model displ  year   cyl trans drv     cty   hwy fl    class
    #>    <chr>        <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
    #>  1 audi         a4      1.8  1999     4 auto~ f        18    29 p     comp~
    #>  2 audi         a4      1.8  1999     4 manu~ f        21    29 p     comp~
    #>  3 audi         a4      2    2008     4 manu~ f        20    31 p     comp~
    #>  4 audi         a4      2    2008     4 auto~ f        21    30 p     comp~
    #>  5 audi         a4      2.8  1999     6 auto~ f        16    26 p     comp~
    #>  6 audi         a4      2.8  1999     6 manu~ f        18    26 p     comp~
    #>  7 audi         a4      3.1  2008     6 auto~ f        18    27 p     comp~
    #>  8 audi         a4 q~   1.8  1999     4 manu~ 4        18    26 p     comp~
    #>  9 audi         a4 q~   1.8  1999     4 auto~ 4        16    25 p     comp~
    #> 10 audi         a4 q~   2    2008     4 manu~ 4        20    28 p     comp~
    #> # ... with 224 more rows, and 1 more variable: n <int>
    
    # plot
    ggplot(data = mpg, mapping = aes(x = class, y = hwy, color = class)) +
      # plotting jittered points
      geom_jitter(size = 3, alpha = 0.5, width = 0.15) +
      # adding boxplots only for class with more than a certain count value
      geom_boxplot(data = dplyr::filter(.data = mpg, n > 20), alpha = 0.5)
    

    reprex package (v0.2.0.9000) 于 2018 年 8 月 23 日创建。

    【讨论】:

    • 没有必要在 dplyr 方法前面加上 dplyr::,因为您已经加载了 tidyverse 包。
    • @MauritsEvers 是的,这可能是多余的,但我仍然认为这是一种很好的代码卫生习惯。
    • 我完全不同意,因为这会造成不必要的混乱并降低可读性。但每个都有自己的(编码风格)。
    • 另外引用 Hadley on the use of :: in function calls“这[即避免 ::] 也有一个小的性能优势,因为 :: 增加了大约 5 µs 的函数评估时间。”我>
    【解决方案2】:

    此解决方案仅绘制小数据集大小的点(根据要求),仅绘制较大类的箱线图:

    library(ggplot2)
    library(dplyr)
    
    min_n <- 20
    
    mpg %>% 
      group_by(class) %>% 
      mutate(class_count = n()) %>% 
      ggplot(mapping = aes(class, hwy, color = class)) +
      geom_jitter(data = . %>% filter(class_count < min_n)) +
      geom_boxplot(data = . %>% filter(class_count >= min_n))
    

    您可能还想看看geom_violin,它添加了有关数据分布的更多信息,我发现比箱线图提供更多信息(你可以同时拥有:)):

    mpg %>% 
      group_by(class) %>% 
      mutate(class_count = n()) %>% 
      ggplot(mapping = aes(class, hwy, color = class)) +
      geom_jitter(data = . %>% filter(class_count < min_n)) +
      geom_violin(data = . %>% filter(class_count >= min_n), scale = "count") +
      geom_boxplot(data = . %>% filter(class_count >= min_n), width = 0.1)
    

    【讨论】:

      猜你喜欢
      • 2019-08-23
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多