R语言如何绘制相关性图

前言

本篇是corrplot包绘制相关性图的教程。

什么是相关性图?

相关性是指两个或多个变量之间的关系或相互影响程度。若两组的值一起增大,我们称之为正相关,若一组的值增大时,另一组的值减小,我们称之为负相关。其值介于-1与1之间,即越接近1,越正相关;越接近-1,越负相关。

常见的有两种计算相关性的算法:皮尔逊相关性(pearson)和斯皮尔曼相关性(spearman)。皮尔逊相关性最常用,适合正态分布的数据。斯皮尔曼相关性是秩相关,不受极大极小值的影响。

在组学中的应用,例如,两个技术性重复实验的结果相关性很低,则说明数据有异常。

需要注意的地方,做样本之间的相关性的时候,蛋白之间要对应,不可随意打乱顺序。数据中有缺失值的情况,通常用”pairwise.complete.obs”算法处理缺失值,即两两配对删除缺失值。

相关性图就是,用图的形式展现出相关性的结果。

绘图前的数据准备

这里就用R语言自带的示例数据了,mtcars

# A tibble: 32 x 11
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
# i 22 more rows

R语言如何绘制相关性图

# 代码来源:https://www.r2omics.cn/
library(corrplot)

# 计算相关性
corData = cor(mtcars,
              method = "pearson",            # 计算相关性的方法有"pearson", "spearman", "kendall"
              use = "pairwise.complete.obs") # 缺失值处理的方式
# 计算相关性的P值和置信区间
testRes = cor.mtest(mtcars,
                    conf.level = 0.95,       # 置信区间
                    method = "pearson")      # 计算相关性的方法有"pearson", "spearman", "kendall"

# 绘图
corrplot(corData,
         method = "circle",           # 图案形状 "square"方框,"circle"圆, "ellipse"椭圆, "number"数字, "shade"阴影花纹, "color"颜色方框, "pie饼图"
         type = "full",               # 绘制范围"full"全部, "lower"下半部分, "upper"半部分
         col=colorRampPalette(c('#0000ff','#ffffff','#ff0000'))(100), # 主体颜色
         bg = "white",                # 背景颜色
         # col.lim = c(-1,1),         # 数据颜色的范围,是相关性数据的话,直接is.corr = T就好
         title = "",                  # 标题
         is.corr = T,                 # 输入的矩阵是否是相关性矩阵,如果是的话,数据范围会限制到-1到1
         add = F,                     # 是否在原来的图层上添加图形
         diag = T,                    # 是否显示主对角
         outline = F,                 # 图案的轮廓,True或False或某一颜色值
         mar = c(0, 0, 0, 0),         # 下 左 上 右 边距
         addgrid.col = NULL,          # 网格线的颜色,NA为不绘制,NULl为默认的灰色
         addCoef.col = NULL,          # 当method!="number"时,是否显示相关性数值,显示的颜色
         addCoefasPercent = F,        # 是否把相关性数值改为百分数
         order = "original",          # 排序方式 c("original", "AOE", "FPC", "hclust", "alphabet"), original:原始状态,alphabet:字母顺序 hclust,分层聚类顺序
         hclust.method = c("complete", "ward", "ward.D", "ward.D2", "single", "average","mcquitty", "median", "centroid"), # 当order = "hclust"时,分层聚类的算法
         tl.pos = "lt",               # 坐标轴标签的位置'lt', 'ld', 'td', 'd' or 'n'   # 左边 d中间
         tl.cex = 1,                  # 坐标轴标签字体的大小
         tl.col = "black",            # 坐标轴标签字体的颜色
         tl.offset = 0.4,             # 坐标轴标签离图案的距离
         tl.srt = 90,                 # 坐标轴标签旋转角度
         cl.pos = "r",                # 图例位置:r:右边 b:下边 n:不显示
         cl.length = NULL,            # 数字越大,图例的分隔越稠
         cl.cex = 0.8,                # 图例的字体大小
         cl.ratio = 0.15,             # 图例的宽度
         cl.align.text = "c",         # 图例文字的对齐方式 l左对齐 c居中 r右对齐
         cl.offset = 0.5,             # 图例文字距离图例颜色条的距离 居中时无效
         number.cex = 1,              # 相关性数字标签的字体大小
         number.font = 2,             # 相关性数字标签的字体
         number.digits = 2,           # 相关性数字标签,保留的小数点位数
         na.label = "",               # 当为NA时,显示的内容
         p.mat = testRes$p,           # P值矩阵
         sig.level = 0.05,            # 当p大于sig.level时触发动作
         insig = "pch",               # p值大于sig.level时的方案"pch"图案, "p-value"P值数字, "blank"空白, "n"无操作, "label_sig"星号,
         pch = 4,                     # 当insig = "pch"时的图案形状 4为叉
         pch.col = "black",           # 图案颜色
         pch.cex = 3,                 # 图案大小
         plotCI = "n",                # c("n", "square", "circle", "rect"),  # p值置信区间的方案
         lowCI.mat = testRes$lowCI,   # p值置信区间下边界数据
         uppCI.mat = testRes$uppCI,   # p值置信区间上边界数据
)

如果想让上下部分绘制的图案不同,只需调整add = T参数,然后再调用corrplot绘制即可,需要注意的是不显示图例和坐标轴标签,其他参数尽量和之前一致。

corrplot(corData,
         method = "number",            # 图案形状 "square"方框,"circle"圆, "ellipse"椭圆, "number"数字, "shade"阴影花纹, "color"颜色方框, "pie饼图"
         type = "lower",               # "full", "lower", "upper"
         col=colorRampPalette(c('#0000ff','#ffffff','#ff0000'))(100), # 主体颜色
         bg = "white",                 # 背景颜色
         is.corr = T,                  # 输入的矩阵是否是相关性矩阵,如果是的话,数据范围会限制到-1到1
         add = T,                      # 是否在原来的图层上添加图形
         diag = F,                     # 是否显示主对角
         addCoefasPercent = F,         # 是否把相关性数值改为百分数
         order = "original",           # 排序方式 c("original", "AOE", "FPC", "hclust", "alphabet"), original:原始状态,alphabet:字母顺序 hclust,分层聚类顺序
         tl.pos = "n",                 # 坐标轴标签的位置'lt', 'ld', 'td', 'd' or 'n'   # 左边 d中间
         cl.pos = "n",                 # 图例位置:r:右边 b:下边 n:不显示
         na.label = "",                # 当为NA时,显示的内容
         p.mat = testRes$p,            # P值矩阵
         sig.level = 0.05,             # 当p大于sig.level时触发动作
)