美文网首页R语言绘图基本图形绘制R ggplot
R 数据可视化 —— ggplot 箱线图和小提琴图

R 数据可视化 —— ggplot 箱线图和小提琴图

作者: 名本无名 | 来源:发表于2021-04-17 18:36 被阅读0次

    箱线图

    箱线图用于展示 5 个统计量:最大值、最小值、中位数、第一分位数和第三分位数。

    从箱线图中可以很容易的看出数据是否对称分布、以及是否包含离散数据,分布的离散程度。也可以用于比较不同变量的分布

    示例

    来个最简单的箱线图

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

    翻转方向

    ggplot(mpg, aes(hwy, class)) + geom_boxplot()
    

    设置凹槽

    p + geom_boxplot(notch = TRUE)
    

    凹槽的宽度可以通过 notchwidth 参数设置,默认为 0.5

    p <- ggplot(mpg, aes(class, hwy))
    p + geom_boxplot(notch = TRUE, notchwidth = 0.9)
    

    默认情况下,每个箱子的宽度是一样的,我们可以设置 varwidth = TRUE,使得宽度与组内观测值的平方根成正比

    p + geom_boxplot(varwidth = TRUE)
    

    为箱子设置颜色

    p + geom_boxplot(fill = "white", colour = "#3366FF")
    

    geom_boxplot 函数中有专门的几个参数用于设置离散值的属性:

    • outlier.colour = NULL,
    • outlier.color = NULL,
    • outlier.fill = NULL,
    • outlier.shape = 19,
    • outlier.size = 1.5,
    • outlier.stroke = 0.5,
    • outlier.alpha = NULL,

    例如

    p + geom_boxplot(outlier.colour = "red", outlier.shape = 1)
    

    设置透明度

    p + geom_boxplot(outlier.fill = "blue", outlier.shape = 21, alpha = 0.5)
    

    但是,当我们想要组合绘制箱线图和散点图时,可能需要将离散点删除

    p + geom_boxplot(outlier.shape = NA) + geom_jitter(width = 0.2)
    

    当我们绘制分组箱线图时,默认以并列的方式排列

    p + geom_boxplot(aes(colour = drv))
    

    而对于连续型 x 变量,需要指定分组。可以搭配 cut_width 使用

    ggplot(diamonds, aes(carat, price)) +
      geom_boxplot(aes(group = cut_width(carat, 0.5)))
    

    如果数据中已经计算过这些统计量,那么也可以将这些变量传递进去。

    例如

    tibble(
      x = rep(LETTERS[1:10], 10),
      y = rnorm(100)
    ) %>% group_by(x) %>%
      summarise(y0 = min(y), y25 = quantile(y, 0.25), y50 = median(y),
                y75 = quantile(y, 0.75), y100 = max(y)) %>%
      ggplot(aes(x)) +
      geom_boxplot(
        aes(ymin = y0, lower = y25, middle = y50, upper = y75, ymax = y100, 
            fill = x),
        stat = "identity"
      )
    

    组合图形

    1. 添加均值标记点
    ggplot(mpg, aes(class, hwy)) + 
      geom_boxplot(aes(fill = class)) +
      stat_summary(fun = "mean", fill = "white", size = 2, geom = "point", shape = 23) 
    
    1. 再添加误差线
    ggplot(mpg, aes(class, hwy)) + 
      stat_boxplot(geom = "errorbar", width = 0.2) +
      geom_boxplot(aes(fill = class)) +
      stat_summary(fun = "mean", fill = "white", 
                   size = 2, geom = "point", shape = 23)
    
    1. 为分组箱线图添加误差线
    ggplot(mpg, aes(class, hwy)) + 
      stat_boxplot(aes(colour = drv), geom = "errorbar",
                   position = position_dodge2(preserve = 'single', padding = 0.5)) +
      geom_boxplot(aes(fill = drv), position = position_dodge2(preserve = 'single'))
    

    注意:由于每种类型的分组并不是都存在,所以会出现箱线图宽度不一致的情况,所以设置了 preserve = 'single'

    同时,在添加分组误差线时,需要指定分组 colour = drv

    1. 定制箱线图
    # 先绘制一个虚线箱线图
    p1 <- ggplot(mpg, aes(class, hwy)) + 
      geom_boxplot(linetype = 'dashed', outlier.colour = "red")
    # 再绘制带颜色的中心矩形,覆盖原来的矩形
    p2 <- p1 +
      stat_boxplot(aes(ymin = after_stat(lower), ymax = after_stat(upper),
                       fill = class)) 
    # 设置上误差线,误差线的最小值设置为数据最大值
    p3 <- p2 +
      stat_boxplot(aes(ymin = after_stat(ymax)), geom = "errorbar", 
                   width = 0.2, colour = "#4daf4a")
    # 设置下误差线
    p3 + 
      stat_boxplot(aes(ymax = after_stat(ymin)), geom = "errorbar",
                   width = 0.2, colour = "#377eb8")
    
    plot_grid(p1, p2, p3, p4)
    

    小提琴图

    小提琴图用于显示数据的分布状态和概率密度,它同时具有箱线图和密度图的特征,用于显示数据的分布形状。

    示例

    来个最简单的例子

    p <- ggplot(mtcars, aes(factor(cyl), mpg))
    p + geom_violin()
    

    更改方向

    ggplot(mtcars, aes(mpg, factor(cyl))) +
      geom_violin()
    

    可以通过设置 scale 参数的值来更改图像大小,支持三个参数值:

    • area:默认,保持所有图形大小一样
    • count:设置最大宽度与样本大小成正比
    • width:所有图形的最大宽度一样
    p + geom_violin(scale = "count")
    

    默认情况下,会删除图形的尾部数据,如果不想删除可以设置 trim = FALSE

    p + geom_violin(trim = FALSE)
    

    设置更小的 bandwidth(adjust) 来绘制更近似的拟合,默认为 1

    p + geom_violin(adjust = .5)
    

    分组小提琴图也是并列的方式排列

    p <- ggplot(mtcars, aes(factor(cyl), mpg))
    
    p1 <- p + geom_violin(aes(fill = cyl))
    
    p2 <- p + geom_violin(aes(fill = factor(cyl)))
    
    p3 <- p + geom_violin(aes(fill = factor(vs)))
    
    p4 <- p + geom_violin(aes(fill = factor(am)))
    
    plot_grid(p1, p2, p3, p4)
    

    显示分位数线

    p + geom_violin(draw_quantiles = c(0.25, 0.5, 0.75))
    

    组合图形

    1. 添加中值点
    ggplot(mpg, aes(class, displ)) + 
      geom_violin(aes(fill = class), show.legend = FALSE) +
      stat_summary(fun = median, geom = "point", shape = 23,
                   size = 2, fill = "white")
    
    1. 添加均值和标准差
    ggplot(mpg, aes(class, displ)) + 
      geom_violin(aes(fill = class), show.legend = FALSE) +
      stat_summary(fun.data = "mean_sdl", fun.args = list(mult = 1),
                   colour = "white")
    

    注意:如果在运行上述代码报错了

    Hmisc package required for this function
    

    需要安装一下 Hmisc,因为 mean_sdl 函数来自 Hmisc

    install.packages("Hmisc")
    
    1. 添加箱线图
    ggplot(mpg, aes(class, displ)) + 
      geom_violin(aes(fill = class), show.legend = FALSE) +
      geom_boxplot(width = 0.1)
    
    1. 添加抖动散点图
    ggplot(mpg, aes(class, displ)) + 
      geom_violin(aes(fill = class), show.legend = FALSE) +
      geom_jitter(width = 0.1)
    
    1. 转换为极坐标
    ggplot(mpg, aes(class, displ)) + 
      geom_violin(aes(fill = class), show.legend = FALSE) +
      geom_boxplot(width = 0.1) +
      coord_polar()
    

    相关文章

      网友评论

        本文标题:R 数据可视化 —— ggplot 箱线图和小提琴图

        本文链接:https://www.haomeiwen.com/subject/kzgulltx.html