You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将自定义相关矩阵用于corrplot或在ggplot中绘制相关椭圆?

刚好这两个需求都能解决,分两个方案给你:

方案1:直接在corrplot中使用自定义相关矩阵及置信区间

其实corrplot完全支持传入你自己估计的相关矩阵,根本不需要从原始数据重新计算!你之前示例里用cor(mtcars)只是默认操作,只要把你通过MCMCglmm得到的相关矩阵替换进去就行。如果还要展示置信区间,corrplot还支持传入上下置信区间矩阵,具体步骤如下:

  1. 转换置信区间为矩阵格式
    你的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
    
  2. 绘制带置信区间的椭圆图
    用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")
    
方案2:在ggplot中实现corrplot风格的椭圆效果

如果一定要用ggplot,我们可以借助corrplot包底层的ellipse()函数生成椭圆坐标,再用ggplot的图层来绘制,步骤如下:

  1. 生成所有椭圆的坐标数据
    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()
    
  2. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:01:02