首页 > 科研绘图 > R语言“小提琴形图”的绘制
2022
06-30

R语言“小提琴形图”的绘制

最初小编是在“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脚本内容

转自纪伟讲测序

最后编辑:
作者:萌小白
一个热爱网络的青年!

发布评论

表情