405

ggplot2 パッケージを使用して 2 つのプロットを並べて配置したいと考えていますpar(mfrow=c(1,2))

たとえば、次の 2 つのプロットを同じスケールで並べて表示したいと考えています。

x <- rnorm(100)
eps <- rnorm(100,0,.2)
qplot(x,3*x+eps)
qplot(x,2*x+eps)

それらを同じdata.frameに入れる必要がありますか?

qplot(displ, hwy, data=mpg, facets = . ~ year) + geom_smooth()
4

15 に答える 15

584

横に並んだ ggplots (またはグリッド上の n 個のプロット)

パッケージgrid.arrange()内の関数は、複数のプロットを結合します。gridExtra2つ並べるとこんな感じ。

require(gridExtra)
plot1 <- qplot(1)
plot2 <- qplot(1)
grid.arrange(plot1, plot2, ncol=2)

これは、2 つのプロットが同じデータに基づいていない場合に便利です。たとえば、reshape() を使用せずに異なる変数をプロットする場合などです。

これにより、副作用として出力がプロットされます。副作用をファイルに出力するには、デバイス ドライバ ( 、 など) を指定しpdfますpng

pdf("foo.pdf")
grid.arrange(plot1, plot2)
dev.off()

または、arrangeGrob()と組み合わせて使用​​しますggsave()

ggsave("foo.pdf", arrangeGrob(plot1, plot2))

これは、 を使用して 2 つの異なるプロットを作成するのと同じですpar(mfrow = c(1,2))。これは、データを配置する時間を節約するだけでなく、2 つの異なるプロットが必要な場合に必要です。


付録: ファセットの使用

ファセットは、異なるグループに対して同様のプロットを作成するのに役立ちます。これは、以下の多くの回答で指摘されていますが、上記のプロットと同等の例でこのアプローチを強調したいと思います。

mydata <- data.frame(myGroup = c('a', 'b'), myX = c(1,1))

qplot(data = mydata, 
    x = myX, 
    facets = ~myGroup)

ggplot(data = mydata) + 
    geom_bar(aes(myX)) + 
    facet_wrap(~myGroup)

アップデート

plot_grid機能は、cowplotの代替としてチェックアウトする価値がありgrid.arrangeます。同等のアプローチについては、以下の@claus-wilkeによる回答とこのビネットを参照してください。ただし、関数を使用すると、この vignetteに基づいて、プロットの位置とサイズをより細かく制御できます。

于 2010-10-14T16:52:58.417 に答える
214

に基づくソリューションの欠点の 1 つはgrid.arrange、ほとんどのジャーナルが要求するように、プロットに文字 (A、B など) のラベルを付けることが困難になることです。

この(および他のいくつかの)問題、特に関数を解決するために、cowplotplot_grid()パッケージを作成しました。

library(cowplot)

iris1 <- ggplot(iris, aes(x = Species, y = Sepal.Length)) +
  geom_boxplot() + theme_bw()

iris2 <- ggplot(iris, aes(x = Sepal.Length, fill = Species)) +
  geom_density(alpha = 0.7) + theme_bw() +
  theme(legend.position = c(0.8, 0.8))

plot_grid(iris1, iris2, labels = "AUTO")

ここに画像の説明を入力

返されるオブジェクトは別の ggplot2 オブジェクトであり、通常どおりplot_grid()に保存できます。ggsave()

p <- plot_grid(iris1, iris2, labels = "AUTO")
ggsave("plot.pdf", p)

あるいは、結合されたプロットの正しい次元を簡単に取得できるsave_plot()薄いラッパーであるcowplot 関数を使用できます。ggsave()

p <- plot_grid(iris1, iris2, labels = "AUTO")
save_plot("plot.pdf", p, ncol = 2)

(ncol = 2引数はsave_plot()、2 つのプロットが横に並んでいるsave_plot()ことを示し、保存されたイメージの幅を 2 ​​倍にします。)

プロットをグリッドに配置する方法の詳細については、このビネットを参照してください。凡例を共有してプロットを作成する方法を説明するビネットもあります。

よくある混乱のポイントの 1 つは、cowplot パッケージがデフォルトの ggplot2 テーマを変更することです。このパッケージは、もともと内部ラボで使用するために作成されたものであり、既定のテーマを使用していないため、そのように動作します。これにより問題が発生する場合は、次の 3 つの方法のいずれかを使用して問題を回避できます。

1. プロットごとにテーマを手動で設定します。+ theme_bw()上記の例で行ったように、プロットごとに特定のテーマを常に指定することをお勧めします。特定のテーマを指定する場合、デフォルトのテーマは関係ありません。

2. デフォルトのテーマを ggplot2 のデフォルトに戻します。これは、1 行のコードで実行できます。

theme_set(theme_gray())

3. パッケージをアタッチせずに cowplot 関数を呼び出します。library(cowplot)orを呼び出すこともできずrequire(cowplot)、代わりに を先頭に追加してカウプロット関数を呼び出すこともできますcowplot::。たとえば、ggplot2 のデフォルト テーマを使用した上記の例は次のようになります。

## Commented out, we don't call this
# library(cowplot)

iris1 <- ggplot(iris, aes(x = Species, y = Sepal.Length)) +
  geom_boxplot()

iris2 <- ggplot(iris, aes(x = Sepal.Length, fill = Species)) +
  geom_density(alpha = 0.7) +
  theme(legend.position = c(0.8, 0.8))

cowplot::plot_grid(iris1, iris2, labels = "AUTO")

ここに画像の説明を入力

アップデート:

  • cowplot 1.0 以降、デフォルトの ggplot2 テーマは変更されなくなりました。
  • ggplot2 3.0.0 以降、プロットに直接ラベルを付けることができます。たとえば、こちらを参照してください。
于 2015-07-04T17:53:48.543 に答える
51

Winston ChangのRクックブックから次のmultiplot関数 を使用できます

multiplot(plot1, plot2, cols=2)

multiplot <- function(..., plotlist=NULL, cols) {
    require(grid)

    # Make a list from the ... arguments and plotlist
    plots <- c(list(...), plotlist)

    numPlots = length(plots)

    # Make the panel
    plotCols = cols                          # Number of columns of plots
    plotRows = ceiling(numPlots/plotCols) # Number of rows needed, calculated from # of cols

    # Set up the page
    grid.newpage()
    pushViewport(viewport(layout = grid.layout(plotRows, plotCols)))
    vplayout <- function(x, y)
        viewport(layout.pos.row = x, layout.pos.col = y)

    # Make each plot, in the correct location
    for (i in 1:numPlots) {
        curRow = ceiling(i/plotCols)
        curCol = (i-1) %% plotCols + 1
        print(plots[[i]], vp = vplayout(curRow, curCol ))
    }

}
于 2011-12-05T21:17:39.577 に答える
18

はい、データを適切に配置する必要があると考えています。1つの方法はこれです:

X <- data.frame(x=rep(x,2),
                y=c(3*x+eps, 2*x+eps),
                case=rep(c("first","second"), each=100))

qplot(x, y, data=X, facets = . ~ case) + geom_smooth()

plyrやreshapeにはもっと良いトリックがあると確信しています-私はまだHadleyによるこれらの強力なパッケージすべてについて実際にスピードを上げていません。

于 2009-08-08T18:56:06.040 に答える
16

reshape パッケージを使用すると、このようなことができます。

library(ggplot2)
wide <- data.frame(x = rnorm(100), eps = rnorm(100, 0, .2))
wide$first <- with(wide, 3 * x + eps)
wide$second <- with(wide, 2 * x + eps)
long <- melt(wide, id.vars = c("x", "eps"))
ggplot(long, aes(x = x, y = value)) + geom_smooth() + geom_point() + facet_grid(.~ variable)
于 2009-08-10T09:52:11.657 に答える
9

更新:この回答は非常に古いものです。gridExtra::grid.arrange()現在推奨される方法です。役に立つかもしれない場合に備えて、これをここに残します。


Stephen TurnerがGetting Genetics Doneブログに関数を投稿arrange()しました(アプリケーションの説明については投稿を参照してください)。

vp.layout <- function(x, y) viewport(layout.pos.row=x, layout.pos.col=y)
arrange <- function(..., nrow=NULL, ncol=NULL, as.table=FALSE) {
 dots <- list(...)
 n <- length(dots)
 if(is.null(nrow) & is.null(ncol)) { nrow = floor(n/2) ; ncol = ceiling(n/nrow)}
 if(is.null(nrow)) { nrow = ceiling(n/ncol)}
 if(is.null(ncol)) { ncol = ceiling(n/nrow)}
        ## NOTE see n2mfrow in grDevices for possible alternative
grid.newpage()
pushViewport(viewport(layout=grid.layout(nrow,ncol) ) )
 ii.p <- 1
 for(ii.row in seq(1, nrow)){
 ii.table.row <- ii.row 
 if(as.table) {ii.table.row <- nrow - ii.table.row + 1}
  for(ii.col in seq(1, ncol)){
   ii.table <- ii.p
   if(ii.p > n) break
   print(dots[[ii.table]], vp=vp.layout(ii.table.row, ii.col))
   ii.p <- ii.p + 1
  }
 }
}
于 2010-04-28T04:49:41.290 に答える
7

使用tidyverse:

x <- rnorm(100)
eps <- rnorm(100,0,.2)
df <- data.frame(x, eps) %>% 
  mutate(p1 = 3*x+eps, p2 = 2*x+eps) %>% 
  tidyr::gather("plot", "value", 3:4) %>% 
  ggplot(aes(x = x , y = value)) + 
    geom_point() + 
    geom_smooth() + 
    facet_wrap(~plot, ncol =2)

df

ここに画像の説明を入力

于 2017-01-30T05:09:43.757 に答える