12

我的问题是双重的;

我有一个默认的 ggpairs 图,upper = list(continuous = cor)我想通过相关值对图块着色(就像 ggcorr 所做的那样)。

我有这个:ggpairs 每日流量图
我希望上图的相关值是这样着色的:相关值的ggcorr热图

library(GGally)

sample_df <- data.frame(replicate(7,sample(0:5000,100)))
colnames(sample_df) <- c("KUM", "MHP", "WEB", "OSH", "JAC", "WSW", "gaugings")

ggpairs(sample_df, lower = list(continuous = "smooth"))  
ggcorr(sample_df, label = TRUE, label_round = 2)

我曾短暂尝试使用upper = list(continuous = wrap(ggcorr)但没有任何运气,并且鉴于这两个函数都返回绘图调用,我认为这不是正确的路径吗?

我知道我可以在 ggplot 中构建它(例如Sandy Muspratt 的解决方案),但鉴于 GGally 包已经具有我正在寻找的功能,我想我可能会忽略一些东西。


更广泛地说,我想知道我们如何,或者如果我们可以,调用相关值?一个更简单的选择可能是为标签而不是瓷砖着色(即这个问题使用颜色而不是大小),但我需要一个变量来分配颜色......

能够调用相关值以在其他图中使用会很方便,尽管我想我可以自己重新计算它们。

谢谢!

4

2 回答 2

11

一种可能的解决方案是从ggcorr相关矩阵图中获取颜色列表,并将这些颜色设置为图矩阵上部图块中的背景ggpairs

library(GGally)   
library(mvtnorm)
# Generate data
set.seed(1)
n <- 100
p <- 7
A <- matrix(runif(p^2)*2-1, ncol=p) 
Sigma <- cov2cor(t(A) %*% A)
sample_df <- data.frame(rmvnorm(n, mean=rep(0,p), sigma=Sigma))
colnames(sample_df) <- c("KUM", "MHP", "WEB", "OSH", "JAC", "WSW", "gaugings")

# Matrix of plots
p1 <- ggpairs(sample_df, lower = list(continuous = "smooth"))  
# Correlation matrix plot
p2 <- ggcorr(sample_df, label = TRUE, label_round = 2)

相关矩阵图为:

在此处输入图像描述

# Get list of colors from the correlation matrix plot
library(ggplot2)
g2 <- ggplotGrob(p2)
colors <- g2$grobs[[6]]$children[[3]]$gp$fill

# Change background color to tiles in the upper triangular matrix of plots 
idx <- 1
for (k1 in 1:(p-1)) {
  for (k2 in (k1+1):p) {
    plt <- getPlot(p1,k1,k2) +
     theme(panel.background = element_rect(fill = colors[idx], color="white"),
           panel.grid.major = element_line(color=colors[idx]))
    p1 <- putPlot(p1,plt,k1,k2)
    idx <- idx+1
}
}
print(p1)

在此处输入图像描述

于 2017-08-25T13:15:30.477 回答
8

您可以通过编写一个可以直接传递给的快速自定义函数将背景颜色映射到单元格ggpairs。这涉及计算变量对之间的相关性,然后匹配某些用户指定的颜色范围。

my_fn <- function(data, mapping, method="p", use="pairwise", ...){

              # grab data
              x <- eval_data_col(data, mapping$x)
              y <- eval_data_col(data, mapping$y)

              # calculate correlation
              corr <- cor(x, y, method=method, use=use)

              # calculate colour based on correlation value
              # Here I have set a correlation of minus one to blue, 
              # zero to white, and one to red 
              # Change this to suit: possibly extend to add as an argument of `my_fn`
              colFn <- colorRampPalette(c("blue", "white", "red"), interpolate ='spline')
              fill <- colFn(100)[findInterval(corr, seq(-1, 1, length=100))]

              ggally_cor(data = data, mapping = mapping, ...) + 
                theme_void() +
                theme(panel.background = element_rect(fill=fill))
            }

使用 Marco 回答中的数据:

library(GGally)    # version: ‘1.4.0’

p1 <- ggpairs(sample_df, 
                   upper = list(continuous = my_fn),
                   lower = list(continuous = "smooth"))  

这使:

在此处输入图像描述


一个后续问题Change axis labels of a modified ggpairs plot (heatmap of correlation)指出,后期图更新theme导致panel.background颜色被删除。这可以通过删除theme_void和删除主题中的网格线来解决。即将相关位更改为(请注意,ggplot2 v3.3.0 不需要此修复)

ggally_cor(data = data, mapping = mapping, ...) + 
           theme(panel.background = element_rect(fill=fill, colour=NA),
                 panel.grid.major = element_blank()) 
于 2018-12-08T19:09:34.117 回答