R语言ggplot2中是否有等效于PerformanceAnalytics的chart.Correlation函数
目前ggplot2生态有成熟的等效实现方案,不需要完全从零开发,同时也支持你要求的加权数据适配,具体实现方式如下:
方案1:直接使用GGally包的ggpairs函数
GGally是ggplot2的官方拓展包之一,其提供的ggpairs函数是最接近PerformanceAnalytics::chart.Correlation的现成工具,默认支持ggplot2的全套语法规则,可直接传入权重映射。
基础无权重版本的用法和原函数几乎一致:
# 加载所需包 library(ggplot2) library(GGally) library(PerformanceAnalytics) data(managers) # 生成和原chart.Correlation效果近似的相关矩阵图 ggpairs( managers[,1:8], lower = list(continuous = wrap("points", pch = "+")), diag = list(continuous = wrap("barDiag", bins = 15)), upper = list(continuous = wrap("cor", size = 3)) )
方案2:自定义加权版本的相关矩阵图
如果需要完全适配加权数据,只需要自定义ggpairs三个区域的绘图函数即可,代码如下:
首先安装加载额外需要的加权计算包:
install.packages("weights") library(weights)
构造带权重的示例数据,实际使用时替换为你的真实权重列即可:
df <- as.data.frame(managers[,1:8]) df$weight <- runif(nrow(df), 0.5, 2) # 示例权重列
分别自定义上三角(加权相关系数+显著性标记)、对角线(加权直方图/密度曲线)、下三角(加权散点)的绘图函数:
# 上三角:加权相关系数+显著性标记 wtd_cor <- function(data, mapping, ...){ x <- eval_data_col(data, mapping$x) y <- eval_data_col(data, mapping$y) w <- eval_data_col(data, mapping$weight) cor_res <- wtd.cor(x, y, weight = w) r <- round(cor_res[1,1], 2) sig <- cut(cor_res[1,4], breaks = c(-Inf, 0.001, 0.01, 0.05, Inf), labels = c("***", "**", "*", "")) ggplot(data, mapping) + geom_text(aes(label = paste0(r, "\n", sig)), size = 4) + theme_void() } # 对角线:加权直方图+加权密度曲线 wtd_diag <- function(data, mapping, ...){ ggplot(data, mapping) + geom_histogram(aes(y = after_stat(density), weight = weight), bins = 15, fill = "grey90", col = "black") + geom_density(aes(weight = weight), col = "#d73027", linewidth = 1) } # 下三角:加权散点图 wtd_point <- function(data, mapping, ...){ ggplot(data, mapping) + geom_point(aes(weight = weight), pch = "+", alpha = 0.7) }
最终调用ggpairs生成加权相关矩阵图:
ggpairs( df, columns = 1:8, # 指定参与相关计算的列,排除权重列 mapping = aes(weight = weight), # 全局传入权重映射 lower = list(continuous = wtd_point), diag = list(continuous = wtd_diag), upper = list(continuous = wtd_cor) ) + theme_bw()
如果需要高频使用,可以把上述逻辑封装成独立函数,调用方式和原chart.Correlation完全一致,还可以按需自定义配色、字体、显著性规则等样式,灵活度远高于原函数。
内容的提问来源于stack exchange,提问作者Markm0705
相关产品推荐
相关产品推荐

