美文网首页灵感拾遗
R语言的“密度提琴图”绘制方法,让提琴图更加丰富多彩

R语言的“密度提琴图”绘制方法,让提琴图更加丰富多彩

作者: 纪伟讲测序 | 来源:发表于2021-01-02 12:44 被阅读0次

    最初小编是在“A genome-based model for adjusting radiotherapy dose (GARD): a retrospective, cohort-based study”这篇文章中看到的一个图。

    它形似一张提琴图,展示了来自不同类型疾病患者个体的GARD得分的分布,图中红色点代表了中位数。但与常规提琴图不同的地方在于,提琴图中还添加了密度信息,即数值分布更多区域颜色更为明显。尽管提琴图的宽度足以代表数值的分布区间了,颜色的添加使其更为丰富多彩。

    文献插图 图2

    本节内容,就让小编来讲一下这种“密度提琴图”如何在R中绘制。

    其实,如果从提琴图的角度出发,即首先绘制一个提琴图,然后设法在其中标识出密度,则该图是很难实现的。这点小编深有体会,好几个人折腾了老半天也没能成功地在提琴图中设置密度颜色。

    因此,我们需要换个角度思考该图的绘制方法。设想一下,既然要表示密度,那么首先不妨绘制一个密度分布图观测数据。

    #绘制密度分布图
    library(ggplot2)
    library(ggridges)
    
    #lincoln_weather是来自ggridges包的数据,详情输入 ?lincoln_weather 查看数据说明
    p1 <- ggplot(lincoln_weather, aes(x = `Mean Temperature [F]`, y = `Month`, fill = ..density..)) + 
    geom_density_ridges_gradient(scale = 0.5, gradient_lwd = NA, rel_min_height = NA,size = NA) + 
    scale_fill_gradientn(colours = colorRampPalette(c('#663490', '#5054A3', '#37A3D2', '#3EB897', '#6EBB46', '#C0D857'))(30)) +
    theme(panel.grid = element_blank(), panel.background = element_rect(fill = 'transparent', color = 'black'), plot.background = element_blank()) +
    labs(x = 'Mean Temperature', y = 'Month', fill = '')
    
    p1
    
    密度分布图

    有没有什么感触呢?

    对的没错,密度提琴图可以视为两张“相反方向”的密度分布图的叠加。因此,我们再绘制一个反方向的。

    #“反方向”的密度分布图
    #既然为了后续叠加图做准备,那么就不要带任何背景
    p2 <- ggplot(lincoln_weather, aes(x = `Mean Temperature [F]`, y = `Month`, fill = ..density..)) + 
    geom_density_ridges_gradient(scale = -0.5, gradient_lwd = NA, rel_min_height = NA,size = NA) + 
    scale_fill_gradientn(colours = colorRampPalette(c('#663490', '#5054A3', '#37A3D2', '#3EB897', '#6EBB46', '#C0D857'))(30)) +
    theme(panel.grid = element_blank(), panel.background = element_blank(), plot.background = element_blank()) +
    labs(x = 'Mean Temperature', y = 'Month', fill = '')
    
    p2
    
    反转方向的密度分布图

    最后,将两张图组合在一起,就获得密度提琴图了,是不是?

    同时,也计算各个变量的中位数,并以红点的形式标注在图中。

    #计算中位数值
    med <- aggregate(lincoln_weather$`Mean Temperature [F]`, by = list(lincoln_weather$`Month`), FUN = median)
    
    #把中位数以红点的形式添在图中
    p2 <- p2 +
    annotate('text', label = '.', x = med$x, y = med$Group.1, size = 10, colour = 'red', vjust = -0.02)
    
    #组合上下两张图获得密度提琴图
    library(grid)
    
    grid.newpage()
    print(p1, vp = viewport(x = 0.5, y = 0.5))
    print(p2, vp = viewport(x = 0.5, y = 0.5))
    
    两个密度分布图,组合成密度提琴图

    这样,密度提琴图就得到了。和常规的提琴图相比,它是不是更漂亮呢?

    相关文章

      网友评论

        本文标题:R语言的“密度提琴图”绘制方法,让提琴图更加丰富多彩

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