我希望有更简单的方法来做这件事情,但这是一种比较粗暴的方法。但这确实能够让你更加灵活地自定义图表。主要就是通过使用putPlot
将一个ggplot2
的绘图放入到图中。
library(ggplot2)
cols <- expand.grid(names(iris)[1:4], names(iris)[1:3])
cols <- cols[c(2:4, 7:8, 12),]
pars <- list(geom_point(alpha=0.8, color="blue"),
geom_smooth(method="lm", color="red", lwd=1.1))
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')
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
![enter image description here](https://istack.dev59.com/veaid.webp)
scaled <- as.data.frame(scale(iris[,1:4]))
fit <- lm(Sepal.Length ~ Sepal.Width, data=scaled)
coef(fit)[2]
编辑
为了将其泛化为一个接受任何列索引并制作相同图形的函数
.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,]
pars <- list(geom_point(alpha=0.8, color="blue"),
geom_smooth(method="lm", color="red", lwd=1.1))
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 )
}
.ggpairs(c(1, 3))
alpha=0.3
添加到散点图的较低列表参数中来控制点的透明度。这将有助于更加关注平滑的线条。 - nehiljain