R语言“小提琴形图”的绘制
卖萌控的博客
点击这里进入电脑版页面!体验更好
R语言“小提琴形图”的绘制
2022-6-30 萌小白


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


转自纪伟讲测序
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容