如何将自定义相关矩阵用于corrplot或在ggplot中绘制相关椭圆?
刚好这两个需求都能解决,分两个方案给你:
其实corrplot完全支持传入你自己估计的相关矩阵,根本不需要从原始数据重新计算!你之前示例里用cor(mtcars)只是默认操作,只要把你通过MCMCglmm得到的相关矩阵替换进去就行。如果还要展示置信区间,corrplot还支持传入上下置信区间矩阵,具体步骤如下:
转换置信区间为矩阵格式
你的melted_cormat是长格式,需要转成宽格式的上下限矩阵,用reshape2的dcast就能搞定:library(reshape2) # 生成下限置信区间矩阵 lower_ci_matrix <- dcast(melted_cormat, Var1 ~ Var2, value.var = "lower") %>% column_to_rownames("Var1") %>% as.matrix() # 生成上限置信区间矩阵 upper_ci_matrix <- dcast(melted_cormat, Var1 ~ Var2, value.var = "upper") %>% column_to_rownames("Var1") %>% as.matrix() # 替换成你用MCMCglmm得到的自定义相关矩阵 custom_cor <- car.cor绘制带置信区间的椭圆图
用corrplot()函数传入自定义矩阵和置信区间,指定method = "ellipse"就能得到你想要的效果:corrplot(corr = custom_cor, lowCI = lower_ci_matrix, upperCI = upper_ci_matrix, method = "ellipse", type = "upper") # 可选:只显示上三角,和corrplot.mixed风格一致如果想要像
corrplot.mixed那样上下三角不同样式(比如上三角椭圆、下三角数值),直接把自定义矩阵传入corrplot.mixed就行:corrplot.mixed(corr = custom_cor, upper = "ellipse", lower = "number")
如果一定要用ggplot,我们可以借助corrplot包底层的ellipse()函数生成椭圆坐标,再用ggplot的图层来绘制,步骤如下:
生成所有椭圆的坐标数据
corrplot::ellipse()可以根据单个相关系数生成椭圆的坐标点,我们循环遍历每个相关系数,生成完整的椭圆数据集:library(dplyr) # 生成椭圆坐标数据框 ellipse_data <- lapply(1:nrow(custom_cor), function(i) { lapply(1:ncol(custom_cor), function(j) { r_val <- custom_cor[i, j] # 生成椭圆坐标,x0/y0对应矩阵在图中的位置 ell_coords <- corrplot::ellipse(r_val, x0 = j, y0 = nrow(custom_cor) - i + 1) data.frame( x = ell_coords[,1], y = ell_coords[,2], Var1 = rownames(custom_cor)[i], Var2 = colnames(custom_cor)[j], corr = r_val ) }) }) %>% bind_rows()用ggplot绘制椭圆图
把椭圆坐标和相关系数结合,添加颜色映射和数值标签(可选):ggplot() + # 绘制椭圆轮廓 geom_path(data = ellipse_data, aes(x = x, y = y, color = corr), linewidth = 1) + # 添加相关系数数值标签(可选) geom_text(data = melted_cormat, aes(x = as.integer(Var2), y = nrow(custom_cor) - as.integer(Var1) + 1, label = round(value, 2))) + # 设置坐标轴标签 scale_x_continuous(breaks = 1:ncol(custom_cor), labels = colnames(custom_cor)) + scale_y_continuous(breaks = 1:nrow(custom_cor), labels = rev(rownames(custom_cor))) + # 设置颜色渐变(和corrplot风格一致) scale_color_gradient2(low = "blue", mid = "white", high = "red", midpoint = 0) + # 保持椭圆比例正确 coord_fixed() + # 简洁主题 theme_minimal()这里注意y轴坐标的反转,因为ggplot的y轴是从下到上的,而corrplot的矩阵是从上到下排列的,所以用
nrow(custom_cor) - as.integer(Var1) + 1来调整位置。
补充提示:如果你的MCMCglmm输出的是相关系数的后验分布,你可以先计算后验均值作为点估计,再计算95%置信区间(比如取后验分位数的2.5%和97.5%)作为上下限,再按照上面的方法使用即可。
内容的提问来源于stack exchange,提问作者klaskowski

