可视化:density与ridgeline

  今天我们来谈谈生信分析中的常规图形 -- 密度图与山脊图 (densityridgeline)。为什么要把这个两图一起介绍呢?因为这两个图关系非常亲密,本质上呈现的意义是相同的。密度图,常用于展示一组变量的取值分布。而山脊图则常用于展示多分组时某一变量在各分组中的取值分布。这么看来,山脊图就像是密度图的团购形式。下面我们就一起来见证一下吧!

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
可视化:泡泡图

推荐阅读更多精彩内容