tl;drggpairs
は、満足のいくスタンドアロンの凡例 (プロット全体で共通の色を説明する) を取得できません。
長々とすみません。
GGally::ggpairs
(さまざまな種類のプロット行列を で描画するための拡張パッケージ) を使用して (下三角) ペア プロットを描画しようとしていggplot2
ます。これは基本的に、外部の凡例を ggpairs() に追加する方法は?と同じ質問です。、しかし、私はその質問への答えに審美的に満足していないので、これを拡張機能として投稿しています(コメント投稿者から提案/推奨された場合、この質問を削除し、代わりにその質問に報奨金を提供します)。特に、凡例をサブプロット フレームの外側に表示して、1 つの仮想サブプロット内に配置するが追加の幅を保持できるようにするか、(理想的には) 別の (空の) サブプロットに配置します。以下に示すように、私の部分的な解決策には両方とも問題があります。
偽のデータ:
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)
問題:
- 凡例の背後にある空白のパネルは、実際にはいくつかのポイントを隠しています。いつものようにパネルの外にない理由はわかりませんが、それ
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)
問題:
- によって抑制された軸とラベル
ggpairs
が戻ってきました ...
また、凡例のみを含む特別なプロットを含むパネルを作成することも検討しました (つまりtheme(SOMETHING=element.blank)
、プロット自体を非表示にするために使用しようとしましたが、その方法がわかりませんでした。
最後の手段として、必要に応じて自分で軸をトリミングすることもできますが、これはggpairs
そもそも何をしているのかを実質的に再発明しています...