14

コンテクスト

同じページに同じ凡例の2つのggplot2をプロットしたいと思います。http://code.google.com/p/gridextra/wiki/arrangeGrobは、これを行う方法を説明しています。これはすでによさそうだ。しかし...私の例では、同じx軸と異なるy軸を持つ2つのプロットがあります。y軸の範囲が他のプロットの少なくとも10倍高い場合(たとえば、1000ではなく10000)、ggplot2(またはグリッド?)はプロットを正しく位置合わせしません(以下の出力を参照)。

質問

2つの異なるy軸を使用して、プロットの左側を整列させるにはどうすればよいですか?

サンプルコード

x = c(1, 2)
y = c(10, 1000)
data1 = data.frame(x,y)
p1 <- ggplot(data1) + aes(x=x, y=y, colour=x) + geom_line()

y = c(10, 10000)
data2 = data.frame(x,y)
p2 <- ggplot(data2) + aes(x=x, y=y, colour=x) + geom_line()


# Source: http://code.google.com/p/gridextra/wiki/arrangeGrob
leg <- ggplotGrob(p1 + opts(keep="legend_box"))
legend=gTree(children=gList(leg), cl="legendGrob")
widthDetails.legendGrob <- function(x) unit(3, "cm")
grid.arrange(
  p1 + opts(legend.position="none"),
  p2 + opts(legend.position="none"),
  legend=legend, main ="", left = "")

出力

画像の例

4

3 に答える 3

10

同じことをよりクリーンに行う方法ですが、より一般的な方法は、フォーマッターargを使用することです。

p1 <- ggplot(data1) +
    aes(x=x, y=y, colour=x) +
    geom_line() + 
    scale_y_continuous(formatter = function(x) format(x, width = 5))

2番目のプロットについても同じことを行い、幅>=両方のプロットで予想される最も広い数値を設定してください。

于 2012-09-15T11:30:10.253 に答える
8

1.カウプロットパッケージの使用:

library(cowplot)
plot_grid(p1, p2, ncol=1, align="v")

ここに画像の説明を入力してください


2. ggbioパッケージtracksからの使用:

注:バグがあるようです。xティックが整列しません。(2016年3月17日にテスト済み、ggbio_1.18.5)

library(ggbio)
tracks(data1=p1,data2=p2)

ここに画像の説明を入力してください

于 2014-08-22T15:57:19.297 に答える
7

p1恥知らずな恨みを気にしない場合は、次のように、の最長のラベルに文字を追加するだけです。

p1 <- ggplot(data1) +
    aes(x=x, y=y, colour=x) +
    geom_line() + 
    scale_y_continuous(breaks = seq(200, 1000, 200),
                       labels = c(seq(200, 800, 200), " 1000"))

根本的な質問が2つありますが、理由があればご容赦ください。

1)両方で同じy軸を使用しないのはなぜですか?scale_y_continuous(limits = c(0, 10000))これはもっと簡単なアプローチであり、上記の例ではにを追加することで簡単に実現できると思いますp1

2)ここで提供される機能facet_wrapは不十分ですか?データ構造が実際にどのようなものかを知るのは難しいですが、これを行う方法のおもちゃの例を次に示します。

library(ggplot2)

# Maybe your dataset is like this
x <- data.frame(x = c(1, 2),
                y1 = c(0, 1000),
                y2 = c(0, 10000))

# Molten data makes a lot of things easier in ggplot
x.melt <- melt(x, id.var = "x", measure.var = c("y1", "y2"))

# Plot it - one page, two facets, identical axes (though you could change them),
# one legend
ggplot(x.melt, aes(x = x, y = value, color = x)) +
    geom_line() +
    facet_wrap( ~ variable, nrow = 2)
于 2011-08-19T18:22:45.577 に答える