9

同じ一般的な方向に進んでいるトピックがいくつかありますが、私の問題を具体的に扱うトピックは見つかりませんでした。したがって、新しいトピックであり、すべての助けに感謝します。

状況

私は水平方向に単一の図に入る必要がある2つのプロットを持っています。

library(ggplot2)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ]    
p1 <- qplot(price, carat, data=dsamp, colour=clarity)
p2 <- qplot(price, depth, data=dsamp, colour=clarity)

従属変数はプロットごとに異なりますが、グループ化と独立変数は同じままです。したがって、グループを説明するには、図の凡例が 1 つあれば十分です。

私が試したこととうまくいかなかったこと

R Cookbookで説明されているように、ソリューションを使用しようとしました。そのページで指定されたカスタムmultiplot()関数は、凡例なしでプロットをうまくレンダリングします。ただし、凡例が 1 つだけ必要な場合、その関数は失敗します。グラフの 1 つには凡例が含まれ、もう 1 つのグラフには含まれないため、両方のグラフの幅は相互に異なります (前述のリンクから multiplot 関数をコピーしてください)。

multiplot(p1 + theme(legend.position = "none"),p2,cols=2)

私が見つけた別の潜在的な解決策は、gridExtraこのコード例を使用したパッケージです。グラフが垂直に配置されていることを除いて、私が必要とすることはほとんどありません。関数の引数をいじってみましたが、プロットを水平に配置する方法がわかりませんでした。誰かがそのパッケージ/問題についてより多くの経験を持っていることを願っています. ありがとう!

4

1 に答える 1

15

これが packagegridExtraとを使用したソリューションgrid.arrange()です。まず、3 つのプロットを作成します。1 つは凡例 (p1.leg) で、2 つは凡例なしです。

p1.leg <- ggplot(dsamp,aes(price,carat,colour=clarity))+geom_point()
p1<-ggplot(dsamp,aes(price,carat,colour=clarity))+geom_point()+
      theme(legend.position="none")
p2 <-ggplot(dsamp,aes(price,depth,colour=clarity))+geom_point()+
     theme(legend.position="none")

g_legend()これで、@Luciano Selzer answer to this questionから借りた関数を使用して、最初のプロットから凡例を取得できます。

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)}

leg<-g_legend(p1.leg)

arrangeGrob()これで、プロットと凡例の両方を関数およびと組み合わせることができますgrid.arrange()。ではarrangeGrob()、列の幅を設定して、プロットと凡例の間で必要な比率を得ることができます。

library(gridExtra)
grid.arrange(arrangeGrob(arrangeGrob(p1,p2),leg,ncol=2,widths=c(5/6,1/6)))

ここに画像の説明を入力

アップデート

すべてのプロットを同じ行に配置するには:

grid.arrange(arrangeGrob(p1,p2,leg,ncol=3,widths=c(3/7,3/7,1/7)))

ここに画像の説明を入力

于 2013-06-06T13:30:44.480 に答える