R绘图 | 群体表型分布和相关关系
考察一个群体的多个表型或者一个表型的多个重复,我们想展示其分布和他们之间的相关关系可以使用柱状图和散点图(如下图所示)。
这幅图主要有两部分组成,一个是对角线上的柱状图,使用柱状图展示了每一个表型重复的分布;另一个就是对角线下面的散点图,用散点图展示两两之间的相关关系,并且用不同颜色表示点的密度,在上面标注其相关性。下面我们将使用R语言完成这幅图。
对于这幅图我们可以先分别绘制其中每一个部分,然后使用图片组合、拼接函数进行整合:
分图绘制
首先导入数据,数据格式如下,每一行代表一个样本,每一列代表一个重复:
1 |
|
使用ggplot2
扩展包绘制每一个分图。柱状图使用geom_histogram()
绘制,散点图使用ggpointdensity
包的geom_pointdensity()
函数绘制,使用cor()
函数计算两个重复之间的相关系数,并将其放在图片标题位置,并使用ggtext
包的element_markdown()
函数设置标题的主题,同时使用cowplot
包的theme_half_open()
函数设置整体主题。
1 |
|
组合图片
使用customLayout包进行图片组合,这个包可以对base绘图和ggplot2绘图进行整合,而且比较灵活。首先需要lay_new()函数创建一个拼接画布,然后使用lay_grid()函数组合各个图片。因为总共有5个重复,因此需要一个5×5的画图,如下图所示,各个分图从左上角开始往下排列走”之“字形排列。
1 |
|
现在出现了一个问题,我们并没有在对角线上方安排图片,而lay_new()产生的是一个矩形排列画布,因此我们需要在右上角填充空白图片,并将空白图和柱状图、散点密度图整合。
1 |
|
整理以上过程
在一个5×5的组合中我们总共需要绘制25个分图,其中有多次重复的过程,并且最终图片是矩形有规律分布,因此为了减少代码长度我们可以使用循环来处理每个分图。根据lay_new()的组合形式可以设置两层循环分别处理行和列,并且因为组合图是从左上角开始向下排布,因此外层循环用来处理行,内层分布处理列。最后一点就是可以把这一系列代码写成一个function,方便以后使用。
最终代码如下所示:
1 |
|