灵感拾遗

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

2021-01-02  本文已影响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))
两个密度分布图,组合成密度提琴图

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

上一篇下一篇

猜你喜欢

热点阅读