7

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そもそも何をしているのかを実質的に再発明しています...

4

1 に答える 1

2

解決策 1 を少し変更します。まず、凡例なしでプロットのマトリックスを描画します (ただし、カラー マッピングは使用します)。次に、trim_gg関数を使用して斜めのスペースを削除します。3 番目に、左上の位置にあるプロットについて、その凡例を描画しますが、右側の空のスペースに配置します。

data(state)
dd <- data.frame(state.x77,
             State = state.name,
             Abbrev = state.abb,
             Region = state.region,
             Division = state.division) 

columns <- c(3, 5, 6, 7)
colour <- "Region"

library(GGally)
library(ggplot2)  ## for theme()

# Base plot
ggfun <- function(data = NULL, columns = NULL, colour = NULL, legends = FALSE) {
   ggpairs(data, 
     columns = columns,
     mapping = ggplot2::aes_string(colour = colour),
     lower = list(continuous = "points"),
     diag = list(continuous = "blankDiag"),
     upper = list(continuous = "blank"),
    legends = legends)
}

# Remove the diagonal elements
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)
}

# Get the plot
gg0 <- trim_gg(ggfun(dd, columns, colour))

# For plot in position (1,1), draw its legend in the empty panels to the right
inner <- getPlot(gg0, 1, 1)

inner <- inner + 
   theme(legend.position = c(1.01, 0.5), 
         legend.direction = "horizontal",
         legend.justification = "left") +
   guides(colour = guide_legend(title.position = "top"))  

gg0 <- putPlot(gg0, inner, 1, 1)
gg0

ここに画像の説明を入力

于 2016-05-12T03:03:06.517 に答える