ggpairs 图与相关值的热图
ggpairs plot with heatmap of correlation values
我的问题是双重的;
我有一个带有默认 upper = list(continuous = cor)
的 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)
进行了简短的尝试,但没有任何运气,并且考虑到两个函数 return 都调用了 plot,我认为这不是正确的路径吗?
我知道我可以在 ggplot 中构建它(例如 ),但是考虑到 GGally 包已经具有我正在寻找的功能,我想我可能忽略了一些东西。
更广泛地说,我想知道我们如何(或者如果可以的话)调用相关值?一个更简单的选择可能是为标签而不是图块着色(即 this question 使用颜色而不是大小)但我需要一个变量来分配给颜色...
能够调用相关值以在其他图中使用会很方便,尽管我想我可以自己重新计算它们。
谢谢!
一个可能的解决方案是从 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)
您可以通过编写可直接传递给 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"))
给出:
后续问题 指出 post 情节更新 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())
我的问题是双重的;
我有一个带有默认 upper = list(continuous = cor)
的 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)
进行了简短的尝试,但没有任何运气,并且考虑到两个函数 return 都调用了 plot,我认为这不是正确的路径吗?
我知道我可以在 ggplot 中构建它(例如
更广泛地说,我想知道我们如何(或者如果可以的话)调用相关值?一个更简单的选择可能是为标签而不是图块着色(即 this question 使用颜色而不是大小)但我需要一个变量来分配给颜色...
能够调用相关值以在其他图中使用会很方便,尽管我想我可以自己重新计算它们。
谢谢!
一个可能的解决方案是从 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)
您可以通过编写可直接传递给 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"))
给出:
后续问题 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())