今天我们来谈谈生信分析中的常规图形 -- 密度图与山脊图 (density
,ridgeline
)。为什么要把这个两图一起介绍呢?因为这两个图关系非常亲密,本质上呈现的意义是相同的。密度图,常用于展示一组变量的取值分布。而山脊图则常用于展示多分组时某一变量在各分组中的取值分布。这么看来,山脊图就像是密度图的团购形式。下面我们就一起来见证一下吧!
density
首先,我们先绘制密度图看看,使用ggplot2
内置数据集diamonds
来绘图,这里为了方便跟后面的山脊图做对比,调整了分面和图例的顺序:
library(ggplot2)
p <- ggplot(diamonds,aes(x=price,fill=cut)) +
geom_density() +
facet_grid(factor(cut,levels=c('Ideal','Premium','Very Good','Good','Fair')) ~.) +
theme_bw() +
guides(title='cut', fill = guide_legend(reverse = TRUE))
p
结果如下:
ridgeline
在相同的数据基础上,我们使用ggridges
包来绘制山脊图:
library(ggridges)
p <- ggplot(diamonds, aes(x = price, y = cut, fill = cut)) +
geom_density_ridges() +
theme_ridges() +
theme(legend.position = "none")
p
结果如下:
前面说过山脊图是团购形式的密度图,所以这里说一个想要注意的地方,
ggridges
包不能画只有一个组别的山脊图,意思就是至少得有两个组别。
比较
从上面的两张图可以看出,从分布的形态来说,密度图和山脊图的结果虽然不能说一模一样,但也可以相提并论了。细节上来说,密度图开始端的曲线呈现了断崖,而山脊图却是连续的曲线。当然,这个差异是可以修正的,下面我们就选取上面数据集的一个子集来说明,选取cut为Ideal的数据来进一步作图。
ideal <- subset(diamonds, cut == 'Ideal')
den <- density(ideal$price, n=600)
dendata <- data.frame(price=den$x, y=den$y)
p <- ggplot(dendata,aes(x=price,y=y)) +
geom_polygon(fill='#FDE725FF') +
geom_line() +
theme_minimal() +
scale_y_continuous(breaks=0,labels='Ideal') +
labs(y='')
p
结果如下:
现在这个密度图跟上面的山脊图相比,分布形态看起来不能说一模一样,可以说是完全相似。当然,山脊图还是一些其他方面的呈现形式,比如,可以将颜色映射为随X轴值的大小而变化(将函数geom_density_ridges
替换为geom_density_ridges_gradient
),还可以修改曲线为直方图 (在函数geom_density_ridges
里面添加stat="binline"
语句)。详细的用法,大家可以自行摸索,这里就不在赘述了。
往期绘图
单细胞:不同亚群的基因平均表达热图
可视化:bubble
可视化:scatterplot
可视化:barplot
可视化:泡泡图