如何在 ggpairs [GGally] 中自定义行
How to customize lines in ggpairs [GGally]
我有以下情节:
使用此代码生成:
library("GGally")
data(iris)
ggpairs(iris[, 1:4], lower=list(continuous="smooth", params=c(colour="blue")),
diag=list(continuous="bar", params=c(colour="blue")),
upper=list(params=list(corSize=6)), axisLabels='show')
我的问题是:
- 如何把相关线改成
red
,现在是黑色的
- 相关线隐藏在散点图下方。我想把它放在上面。我该怎么做?
我希望有更简单的方法来做到这一点,但这是一种蛮力方法。但是,它确实为您提供了灵活性,可以轻松地进一步自定义绘图。要点是使用 putPlot
将 ggplot2
绘图放入图中。
library(ggplot2)
## First create combinations of variables and extract those for the lower matrix
cols <- expand.grid(names(iris)[1:4], names(iris)[1:3])
cols <- cols[c(2:4, 7:8, 12),] # indices will be in column major order
## These parameters are applied to each plot we create
pars <- list(geom_point(alpha=0.8, color="blue"),
geom_smooth(method="lm", color="red", lwd=1.1))
## Create the plots (dont need the lower plots in the ggpairs call)
plots <- apply(cols, 1, function(cols)
ggplot(iris[,cols], aes_string(x=cols[2], y=cols[1])) + pars)
gg <- ggpairs(iris[, 1:4],
diag=list(continuous="bar", params=c(colour="blue")),
upper=list(params=list(corSize=6)), axisLabels='show')
## Now add the new plots to the figure using putPlot
colFromRight <- c(2:4, 3:4, 4)
colFromLeft <- rep(c(1, 2, 3), times=c(3,2,1))
for (i in seq_along(plots))
gg <- putPlot(gg, plots[[i]], colFromRight[i], colFromLeft[i])
gg
## If you want the slope of your lines to correspond to the
## correlation, you can scale your variables
scaled <- as.data.frame(scale(iris[,1:4]))
fit <- lm(Sepal.Length ~ Sepal.Width, data=scaled)
coef(fit)[2]
# Sepal.Length
# -0.1175698
## This corresponds to Sepal.Length ~ Sepal.Width upper panel
编辑
泛化为采用任何列索引和
制作相同的情节
## colInds is indices of columns in data.frame
.ggpairs <- function(colInds, data=iris) {
n <- length(colInds)
cols <- expand.grid(names(data)[colInds], names(data)[colInds])
cInds <- unlist(mapply(function(a, b, c) a*n+b:c, 0:max(0,n-2), 2:n, rep(n, n-1)))
cols <- cols[cInds,] # indices will be in column major order
## These parameters are applied to each plot we create
pars <- list(geom_point(alpha=0.8, color="blue"),
geom_smooth(method="lm", color="red", lwd=1.1))
## Create the plots (dont need the lower plots in the ggpairs call)
plots <- apply(cols, 1, function(cols)
ggplot(data[,cols], aes_string(x=cols[2], y=cols[1])) + pars)
gg <- ggpairs(data[, colInds],
diag=list(continuous="bar", params=c(colour="blue")),
upper=list(params=list(corSize=6)), axisLabels='show')
rowFromTop <- unlist(mapply(`:`, 2:n, rep(n, n-1)))
colFromLeft <- rep(1:(n-1), times=(n-1):1)
for (i in seq_along(plots))
gg <- putPlot(gg, plots[[i]], rowFromTop[i], colFromLeft[i])
return( gg )
}
## Example
.ggpairs(c(1, 3))
通过packageVersion("GGally")
检查您的 GGally 版本并将您的 GGally 升级到版本 1.0.1
library("GGally")
library("ggplot2")
data(iris)
lowerFn <- function(data, mapping, method = "lm", ...) {
p <- ggplot(data = data, mapping = mapping) +
geom_point(colour = "blue") +
geom_smooth(method = method, color = "red", ...)
p
}
ggpairs(
iris[, 1:4], lower = list(continuous = wrap(lowerFn, method = "lm")),
diag = list(continuous = wrap("barDiag", colour = "blue")),
upper = list(continuous = wrap("cor", size = 10))
)
我有以下情节:
使用此代码生成:
library("GGally")
data(iris)
ggpairs(iris[, 1:4], lower=list(continuous="smooth", params=c(colour="blue")),
diag=list(continuous="bar", params=c(colour="blue")),
upper=list(params=list(corSize=6)), axisLabels='show')
我的问题是:
- 如何把相关线改成
red
,现在是黑色的 - 相关线隐藏在散点图下方。我想把它放在上面。我该怎么做?
我希望有更简单的方法来做到这一点,但这是一种蛮力方法。但是,它确实为您提供了灵活性,可以轻松地进一步自定义绘图。要点是使用 putPlot
将 ggplot2
绘图放入图中。
library(ggplot2)
## First create combinations of variables and extract those for the lower matrix
cols <- expand.grid(names(iris)[1:4], names(iris)[1:3])
cols <- cols[c(2:4, 7:8, 12),] # indices will be in column major order
## These parameters are applied to each plot we create
pars <- list(geom_point(alpha=0.8, color="blue"),
geom_smooth(method="lm", color="red", lwd=1.1))
## Create the plots (dont need the lower plots in the ggpairs call)
plots <- apply(cols, 1, function(cols)
ggplot(iris[,cols], aes_string(x=cols[2], y=cols[1])) + pars)
gg <- ggpairs(iris[, 1:4],
diag=list(continuous="bar", params=c(colour="blue")),
upper=list(params=list(corSize=6)), axisLabels='show')
## Now add the new plots to the figure using putPlot
colFromRight <- c(2:4, 3:4, 4)
colFromLeft <- rep(c(1, 2, 3), times=c(3,2,1))
for (i in seq_along(plots))
gg <- putPlot(gg, plots[[i]], colFromRight[i], colFromLeft[i])
gg
## If you want the slope of your lines to correspond to the
## correlation, you can scale your variables
scaled <- as.data.frame(scale(iris[,1:4]))
fit <- lm(Sepal.Length ~ Sepal.Width, data=scaled)
coef(fit)[2]
# Sepal.Length
# -0.1175698
## This corresponds to Sepal.Length ~ Sepal.Width upper panel
编辑
泛化为采用任何列索引和 制作相同的情节
## colInds is indices of columns in data.frame
.ggpairs <- function(colInds, data=iris) {
n <- length(colInds)
cols <- expand.grid(names(data)[colInds], names(data)[colInds])
cInds <- unlist(mapply(function(a, b, c) a*n+b:c, 0:max(0,n-2), 2:n, rep(n, n-1)))
cols <- cols[cInds,] # indices will be in column major order
## These parameters are applied to each plot we create
pars <- list(geom_point(alpha=0.8, color="blue"),
geom_smooth(method="lm", color="red", lwd=1.1))
## Create the plots (dont need the lower plots in the ggpairs call)
plots <- apply(cols, 1, function(cols)
ggplot(data[,cols], aes_string(x=cols[2], y=cols[1])) + pars)
gg <- ggpairs(data[, colInds],
diag=list(continuous="bar", params=c(colour="blue")),
upper=list(params=list(corSize=6)), axisLabels='show')
rowFromTop <- unlist(mapply(`:`, 2:n, rep(n, n-1)))
colFromLeft <- rep(1:(n-1), times=(n-1):1)
for (i in seq_along(plots))
gg <- putPlot(gg, plots[[i]], rowFromTop[i], colFromLeft[i])
return( gg )
}
## Example
.ggpairs(c(1, 3))
通过packageVersion("GGally")
检查您的 GGally 版本并将您的 GGally 升级到版本 1.0.1
library("GGally")
library("ggplot2")
data(iris)
lowerFn <- function(data, mapping, method = "lm", ...) {
p <- ggplot(data = data, mapping = mapping) +
geom_point(colour = "blue") +
geom_smooth(method = method, color = "red", ...)
p
}
ggpairs(
iris[, 1:4], lower = list(continuous = wrap(lowerFn, method = "lm")),
diag = list(continuous = wrap("barDiag", colour = "blue")),
upper = list(continuous = wrap("cor", size = 10))
)