更改 ggpairs 中的颜色,因为不推荐使用 params
Change colors in ggpairs now that params is deprecated
我看到了这些帖子
GGally::ggpairs plot without gridlines when plotting correlation coefficient
use ggpairs to create this plot
阅读后我能够实现这个 hack https://github.com/tonytonov/ggally/blob/master/R/gg-plots.r 我的情节看起来像这样
我认为这是一个很好的结果,但我无法更改颜色。
MWE 是这个
library(ggally)
# load the hack
source("ggally_mod.R")
# I saved https://github.com/tonytonov/ggally/blob/master/R/gg-plots.r as "ggally_mod.R"
assignInNamespace("ggally_cor", ggally_cor, "GGally")
ggpairs(swiss)
现在我要运行
ggpairs(swiss,
lower=list(continuous="smooth", wrap=c(colour="blue")),
diag=list(continuous="bar", wrap=c(colour="blue")))
但颜色保持不变。既然 params 不再起作用,有没有办法改变颜色?
您没有正确使用 wrap
-
see the vignette for details。同样对于对角线,您现在必须使用函数 barDiag
(但是 ggpairs
给出了非常有用的错误来说明这一点)
所以对于你的例子,我们可以改变下面的点的 colour
面板和下面的条形 fill
library(GGally)
library(ggplot2)
ggpairs(swiss[1:3],
lower=list(continuous=wrap("smooth", colour="blue")),
diag=list(continuous=wrap("barDiag", fill="blue")))
但是,由于平滑的颜色是硬编码的(参见 ggally_smooth
),要更改其
颜色你需要定义你自己的函数来传递。所以
my_fn <- function(data, mapping, pts=list(), smt=list(), ...){
ggplot(data = data, mapping = mapping, ...) +
do.call(geom_point, pts) +
do.call(geom_smooth, smt)
}
# Plot
ggpairs(swiss[1:4],
lower = list(continuous =
wrap(my_fn,
pts=list(size=2, colour="red"),
smt=list(method="lm", se=F, size=5, colour="blue"))),
diag=list(continuous=wrap("barDiag", fill="blue")))
以类似的方式,这是一种定义新的上相关函数的方法(类似于您拥有的)
cor_fun <- function(data, mapping, method="pearson", ndp=2, sz=5, stars=TRUE, ...){
x <- eval_data_col(data, mapping$x)
y <- eval_data_col(data, mapping$y)
corr <- cor.test(x, y, method=method)
est <- corr$estimate
lb.size <- sz* abs(est)
if(stars){
stars <- c("***", "**", "*", "")[findInterval(corr$p.value, c(0, 0.001, 0.01, 0.05, 1))]
lbl <- paste0(round(est, ndp), stars)
}else{
lbl <- round(est, ndp)
}
ggplot(data=data, mapping=mapping) +
annotate("text", x=mean(x, na.rm=TRUE), y=mean(y, na.rm=TRUE), label=lbl, size=lb.size,...)+
theme(panel.grid = element_blank())
}
ggpairs(swiss,
lower=list(continuous=wrap("smooth", colour="blue")),
diag=list(continuous=wrap("barDiag", fill="blue")),
upper=list(continuous=cor_fun))
您可以使用 wrap()
as explained here. But not all parameters are named for wrap
to be useful. For example, if you try to change default palette with a manual colour scale within wrap
you may get an error like Error in wrap("cor",…) all parameters must be named arguments
. In that case you may build custom functions 修改 GGally 函数的一些参数,以生成适合矩阵图上部、下部或对角线部分的任何类型的 ggplot 对象。
但是,如果您想在不创建自定义函数来设计 ggplot 对象的情况下更改某些参数(未在要 wrap
ped 的 GGally 函数中命名),则有一个(更安全的)快捷方式。您只需在函数调用中调用一个已经存在的 GGally 函数,添加额外的 ggplot 参数。例如,为三个类别(在新列 swiss$groups 中)提供手动比例颜色:
swiss$groups <- gl(n = 3, k = 1, length = nrow(swiss), labels = c("A", "B", "C"))
ggpairs(swiss, mapping = aes(colour = groups), columns = 1:6,
upper = list(continuous = function(data, mapping, ...) {
ggally_cor(data = data, mapping = mapping, size = 2) + scale_colour_manual(values = c("black", "dark green", "red"))}),
lower = list(continuous = function(data, mapping, ...) {
ggally_smooth(data = data, mapping = mapping, alpha = .2) + scale_colour_manual(values = c("black", "dark green", "red"))}),
diag = list(continuous = function(data, mapping, ...) {
ggally_barDiag(data = data, mapping = mapping, alpha = .5) + scale_fill_manual(values = c("black", "dark green", "red"))}))
我看到了这些帖子 GGally::ggpairs plot without gridlines when plotting correlation coefficient use ggpairs to create this plot
阅读后我能够实现这个 hack https://github.com/tonytonov/ggally/blob/master/R/gg-plots.r 我的情节看起来像这样
我认为这是一个很好的结果,但我无法更改颜色。
MWE 是这个
library(ggally)
# load the hack
source("ggally_mod.R")
# I saved https://github.com/tonytonov/ggally/blob/master/R/gg-plots.r as "ggally_mod.R"
assignInNamespace("ggally_cor", ggally_cor, "GGally")
ggpairs(swiss)
现在我要运行
ggpairs(swiss,
lower=list(continuous="smooth", wrap=c(colour="blue")),
diag=list(continuous="bar", wrap=c(colour="blue")))
但颜色保持不变。既然 params 不再起作用,有没有办法改变颜色?
您没有正确使用 wrap
-
see the vignette for details。同样对于对角线,您现在必须使用函数 barDiag
(但是 ggpairs
给出了非常有用的错误来说明这一点)
所以对于你的例子,我们可以改变下面的点的 colour
面板和下面的条形 fill
library(GGally)
library(ggplot2)
ggpairs(swiss[1:3],
lower=list(continuous=wrap("smooth", colour="blue")),
diag=list(continuous=wrap("barDiag", fill="blue")))
但是,由于平滑的颜色是硬编码的(参见 ggally_smooth
),要更改其
颜色你需要定义你自己的函数来传递。所以
my_fn <- function(data, mapping, pts=list(), smt=list(), ...){
ggplot(data = data, mapping = mapping, ...) +
do.call(geom_point, pts) +
do.call(geom_smooth, smt)
}
# Plot
ggpairs(swiss[1:4],
lower = list(continuous =
wrap(my_fn,
pts=list(size=2, colour="red"),
smt=list(method="lm", se=F, size=5, colour="blue"))),
diag=list(continuous=wrap("barDiag", fill="blue")))
以类似的方式,这是一种定义新的上相关函数的方法(类似于您拥有的)
cor_fun <- function(data, mapping, method="pearson", ndp=2, sz=5, stars=TRUE, ...){
x <- eval_data_col(data, mapping$x)
y <- eval_data_col(data, mapping$y)
corr <- cor.test(x, y, method=method)
est <- corr$estimate
lb.size <- sz* abs(est)
if(stars){
stars <- c("***", "**", "*", "")[findInterval(corr$p.value, c(0, 0.001, 0.01, 0.05, 1))]
lbl <- paste0(round(est, ndp), stars)
}else{
lbl <- round(est, ndp)
}
ggplot(data=data, mapping=mapping) +
annotate("text", x=mean(x, na.rm=TRUE), y=mean(y, na.rm=TRUE), label=lbl, size=lb.size,...)+
theme(panel.grid = element_blank())
}
ggpairs(swiss,
lower=list(continuous=wrap("smooth", colour="blue")),
diag=list(continuous=wrap("barDiag", fill="blue")),
upper=list(continuous=cor_fun))
您可以使用 wrap()
as explained here. But not all parameters are named for wrap
to be useful. For example, if you try to change default palette with a manual colour scale within wrap
you may get an error like Error in wrap("cor",…) all parameters must be named arguments
. In that case you may build custom functions 修改 GGally 函数的一些参数,以生成适合矩阵图上部、下部或对角线部分的任何类型的 ggplot 对象。
但是,如果您想在不创建自定义函数来设计 ggplot 对象的情况下更改某些参数(未在要 wrap
ped 的 GGally 函数中命名),则有一个(更安全的)快捷方式。您只需在函数调用中调用一个已经存在的 GGally 函数,添加额外的 ggplot 参数。例如,为三个类别(在新列 swiss$groups 中)提供手动比例颜色:
swiss$groups <- gl(n = 3, k = 1, length = nrow(swiss), labels = c("A", "B", "C"))
ggpairs(swiss, mapping = aes(colour = groups), columns = 1:6,
upper = list(continuous = function(data, mapping, ...) {
ggally_cor(data = data, mapping = mapping, size = 2) + scale_colour_manual(values = c("black", "dark green", "red"))}),
lower = list(continuous = function(data, mapping, ...) {
ggally_smooth(data = data, mapping = mapping, alpha = .2) + scale_colour_manual(values = c("black", "dark green", "red"))}),
diag = list(continuous = function(data, mapping, ...) {
ggally_barDiag(data = data, mapping = mapping, alpha = .5) + scale_fill_manual(values = c("black", "dark green", "red"))}))