tl;dr无法获得独立的图例(描述整个绘图中的常见颜色)ggpairs
令我满意。
抱歉长度。
我正在尝试使用绘制(下三角)对图GGally::ggpairs
(用于绘制各种绘图矩阵的扩展包ggplot2
)。这本质上是同一个问题如何向 ggpairs() 添加外部图例?,但我对这个问题的答案不满意,所以我将其作为扩展发布(如果评论者建议/推荐,我将删除这个问题并提供对该问题的赏金)。我特别希望传说出现outside子图框架,要么将其放在一个虚拟子图中,但允许额外的宽度来容纳它,要么(理想情况下)将其放在一个单独的(空)子图中。如下所示,我的两个部分解决方案都有问题。
虚假数据:
set.seed(101)
dd <- data.frame(x=rnorm(100),
y=rnorm(100),
z=rnorm(100),
f=sample(c("a","b"),size=100,replace=TRUE))
library(GGally)
基本绘图函数:
ggfun <- function(...) {
ggpairs(dd,mapping = ggplot2::aes(color = f),
columns=1:3,
lower=list(continuous="points"),
diag=list(continuous="blankDiag"),
upper=list(continuous="blank"),
...)
}
修剪顶/右列的功能:
trim_gg <- function(gg) {
n <- gg$nrow
gg$nrow <- gg$ncol <- n-1
v <- 1:n^2
gg$plots <- gg$plots[v>n & v%%n!=0]
gg$xAxisLabels <- gg$xAxisLabels[-n]
gg$yAxisLabels <- gg$yAxisLabels[-1]
return(gg)
}
gg0 <- trim_gg(ggfun(legends=TRUE))
删除左栏中的图例(如上面的链接问题所示):
library(ggplot2) ## for theme()
for (i in 1:2) {
inner <- getPlot(gg0,i,1)
inner <- inner + theme(legend.position="none")
gg0 <- putPlot(gg0,inner,i,1)
}
inner <- getPlot(gg0,2,2)
inner <- inner + theme(legend.position="right")
gg0 <- putPlot(gg0,inner,2,2)
Problems:
- 图例后面的空白面板实际上掩盖了一些点;我不知道为什么它不像往常一样在面板之外,我认为这是
ggpairs
是在做
- 如果它位于面板外部(顶部或右侧),我想确保留出一些额外的空间,以便面板本身大小相同。然而,
ggmatrix
/ggpairs
对此看起来非常不灵活。
我能够尝试的唯一选择是以下ggplot 分离图例和图通过提取图例并使用gridExtra::grid.arrange()
:
g_legend <- function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)
}
library(gridExtra)
grid.arrange(getPlot(gg0,1,1),
g_legend(getPlot(gg0,2,2)),
getPlot(gg0,2,1),
getPlot(gg0,2,2)+theme(legend.position="none"),
nrow=2)
Problems:
我还考虑创建一个带有特殊绘图的面板,其中仅包含图例(即尝试使用theme(SOMETHING=element.blank)
抑制情节本身,但不知道该怎么做。
作为最后的手段,我可以自己在适当的地方修剪轴,但这实际上是在重新发明什么ggpairs
首先正在做...