如何在R的psych::pairs.panels中绘制更大的容忍椭圆?
解决
psych::pairs.panels绘制更大容忍椭圆的问题 由于psych::pairs.panels没有直接提供设置椭圆半径的参数,你可以通过以下两种方式实现自定义大小的容忍椭圆:
方法一:自定义修改pairs.panels函数源码
pairs.panels默认绘制的是对应68%置信水平的椭圆(半径约1),我们可以复制其源码并修改椭圆绘制逻辑,添加自定义半径参数:
library(psych) library(MASS) # 用于cov.trob估计稳健协方差 my_pairs_panels <- function(x, ellipse_radius = sqrt(qchisq(0.99, 2)), ...) { # 复制psych::pairs.panels的完整源码(控制台输入`psych::pairs.panels`可查看) # 找到原函数中绘制椭圆的代码块,替换为以下内容: if (ellipses) { el <- cov.trob(cbind(x[, i], x[, j])) lines(ellipse(el$cov, el$center, radius = ellipse_radius), col = col[2], lwd = lwd) } # 其余源码保持与原pairs.panels一致 } # 使用自定义函数绘制99%容忍椭圆 X <- iris X1 <- subset(X, Species == "setosa")[,1:4] my_pairs_panels(X1, method = "pearson", density = TRUE, ellipses = TRUE, lm = TRUE, ellipse_radius = sqrt(qchisq(0.99, 2)) # 99%容忍度,半径≈3.03 )
方法二:先绘制基础图,再手动叠加car::ellipse
先关闭pairs.panels的默认椭圆,然后遍历每个散点图面板,用car::ellipse添加自定义半径的椭圆:
library(psych) library(car) X <- iris X1 <- subset(X, Species == "setosa")[,1:4] # 绘制不带椭圆的pairs图 psych::pairs.panels(X1, method = "pearson", density = TRUE, ellipses = FALSE, # 关闭默认椭圆 lm = TRUE ) # 遍历所有散点图面板(下三角区域) vars <- colnames(X1) n_vars <- length(vars) for (i in 2:n_vars) { for (j in 1:(i-1)) { # 切换到当前面板 panel_idx <- (i-1)*(n_vars) + j plot.new() par(usr = par("usr")) # 提取当前变量对的数据 x <- X1[, j] y <- X1[, i] # 计算均值和协方差 mean_vals <- c(mean(x), mean(y)) cov_mat <- cov(cbind(x, y)) # 绘制99%容忍椭圆 ellipse(cov_mat, center = mean_vals, radius = sqrt(qchisq(0.99, 2)), # 对应99%容忍度 col = "darkred", lwd = 2) } }
关键参数说明
- 容忍椭圆的半径对应卡方分布的分位数:
- 68%置信水平:
sqrt(qchisq(0.68, 2)) ≈ 1(默认) - 95%置信水平:
sqrt(qchisq(0.95, 2)) ≈ 2.45 - 99%置信水平:
sqrt(qchisq(0.99, 2)) ≈ 3.03
- 68%置信水平:
内容的提问来源于stack exchange,提问作者Mew
相关产品推荐
相关产品推荐

