本文作者蒋刘一琦
在生物信息领域我们常常使用R语言对数据可视化。在对数据可视化的时候,我们需要明确想要展示的信息,从而选择最为合适的图突出该信息。本系列文章将介绍多种基于不同R包的作图方法,希望能够帮助到各位读者。
多种多样的相关性图
下图是几张很典型的相关性图。
相关性图
不过上图中给的信息相对冗余,因为颜色和图形大小都与相关性的大小有关。在我们作图的过程中可以考虑将相关性的大小和pvalue用颜色和大小分别表示。
当然除此之外,还有更加复杂的展现相关性的图。下图就不仅展示了相关系数的大小,还给了各种分布,有助于更加具体地了解两个变量之间的相关关系:
散点图体现了所有样本的各种参数情况;条形图表现了不同参数的数据分布情况;数字和星号体现出相关性的具体值和显著性。
可以发现很多时候数据之间的相关性可能并不是简单的线性相关,而只提供相关性检验结果可能会造成信息缺失。但是你也可以看到这幅图提供了比较多的信息,有时候也许这些信息并没有这么重要,展示过多的数据会让读者感到困惑,找不到关键和重点。所以我们在作图的时候要做好取舍,合理、客观地展示有效的关键数据。
怎么做这些相关性图
1)需要什么格式的数据
我们使用R自带的数据mtcars,之前我们已经多次使用过这个数据集,在此不过多介绍。
首先我们来计算以下参数间的相关性,然后再画图。
代码语言:javascript复制data("mtcars")
M<-cor(mtcars)
head(M)
mpg cyl disp hp drat wt qsec vs am gear carb
mpg 1.0000000 -0.8521620 -0.8475514 -0.7761684 0.6811719 -0.8676594 0.41868403 0.6640389 0.5998324 0.4802848 -0.5509251
cyl -0.8521620 1.0000000 0.9020329 0.8324475 -0.6999381 0.7824958 -0.59124207 -0.8108118 -0.5226070 -0.4926866 0.5269883
disp -0.8475514 0.9020329 1.0000000 0.7909486 -0.7102139 0.8879799 -0.43369788 -0.7104159 -0.5912270 -0.5555692 0.3949769
hp -0.7761684 0.8324475 0.7909486 1.0000000 -0.4487591 0.6587479 -0.70822339 -0.7230967 -0.2432043 -0.1257043 0.7498125
drat 0.6811719 -0.6999381 -0.7102139 -0.4487591 1.0000000 -0.7124406 0.09120476 0.4402785 0.7127111 0.6996101 -0.0907898
wt -0.8676594 0.7824958 0.8879799 0.6587479 -0.7124406 1.0000000 -0.17471588 -0.5549157 -0.6924953 -0.5832870 0.4276059
当然如果你已经计算了好了相关性,那么可以直接用相关性的表格进行绘图,类似于下面的数据表:
2)如何作图
本次介绍两个R包:corrplot和PerformanceAnalytics。首先介绍corrplot包。主要的函数为corrplot,改变不同的method,就会看到不同的展现形式,具体如下:
代码语言:javascript复制library(corrplot)
corrplot(M, method="circle")
corrplot(M, method="pie")
corrplot(M, method="color")
corrplot(M, method="number")
corrplot(M, type="upper")
corrplot(M, type="lower")
也可以修改颜色包括背景字体等以及参数顺序:
代码语言:javascript复制col<- colorRampPalette(c("red", "white", "blue"))(20)
corrplot(M, type="upper", order="hclust", col=col)
library(RColorBrewer)
corrplot(M, type="upper", order="hclust",
col=brewer.pal(n=8, name="RdBu"))
corrplot(M, type="upper", order="hclust",
col=brewer.pal(n=8, name="RdYlBu"))
corrplot(M, type="upper", order="hclust",
col=brewer.pal(n=8, name="PuOr"))
#修改背景
corrplot(M, type="upper", order="hclust", col=c("black", "white"),
bg="lightblue")
#修改字体
corrplot(M, type="upper", order="hclust", tl.col="black", tl.srt=45)
如果相关性是非显著的不想显示或用不同的符号显示要怎么办呢?首先我们要得到一张相应的pvalue的表。
代码语言:javascript复制cor.mtest <- function(mat, ...) {
mat <- as.matrix(mat)
n <- ncol(mat)
p.mat<- matrix(NA, n, n)
diag(p.mat) <- 0
for (i in 1:(n - 1)) {
for (j in (i 1):n) {
tmp <- cor.test(mat[, i], mat[, j], ...)
p.mat[i, j] <- p.mat[j, i] <- tmp$p.value
}
}
colnames(p.mat) <- rownames(p.mat) <- colnames(mat)
p.mat
}
# matrix of the p-value of the correlation
p.mat <- cor.mtest(mtcars)
head(p.mat[, 1:5])
mpg cyl disp hp drat
mpg 0.000000e 00 6.112687e-10 9.380327e-10 1.787835e-07 1.776240e-05
cyl 6.112687e-10 0.000000e 00 1.802838e-12 3.477861e-09 8.244636e-06
disp 9.380327e-10 1.802838e-12 0.000000e 00 7.142679e-08 5.282022e-06
hp 1.787835e-07 3.477861e-09 7.142679e-08 0.000000e 00 9.988772e-03
drat 1.776240e-05 8.244636e-06 5.282022e-06 9.988772e-03 0.000000e 00
wt 1.293959e-10 1.217567e-07 1.222320e-11 4.145827e-05 4.784260e-06
#不显著的显示叉叉,筛选的标准为0.01
corrplot(M, type="upper", order="hclust",
p.mat = p.mat, sig.level = 0.01)
#不显著的为空白,筛选的标准为0.01
corrplot(M, type="upper", order="hclust",
p.mat = p.mat, sig.level = 0.01, insig = "blank")
然后我们来制作一张比较好看的图。
代码语言:javascript复制col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))
corrplot(M, method="color", col=col(200),
type="upper", order="hclust",
addCoef.col = "black", #添加相关系数
tl.col="black", tl.srt=45, #修改字体
p.mat = p.mat, sig.level = 0.01, insig = "blank", #显著性筛选
diag=FALSE
)
接下来我们来简单讲一下另一个PerformanceAnalytics包。
代码语言:javascript复制library(PerformanceAnalytics)
my_data <- mtcars[, c(1,3,4,5,6,7)]
chart.Correlation(my_data, histogram=TRUE, pch=19)