Rの1つのグラフに複数のプロットを描画しますか?


13

次のコードを使用して、のグラフに4つのプロットを描画しようとしましたR。プロット間には多くのスペースがあるため、この図には満足できません。したがって、プロットの幅は、プロットを分析するのに十分ではありません。

  1. 誰かが私に4つのプロットを持つ素敵なグラフを作成するのを手伝ってもらえますか?

  2. デフォルトの5つのラベルの代わりに1から10のx軸ラベルを保持するにはどうすればよいですか?

データ:

a1:11.013 13.814 13.831 13.714 13.787 13.734 13.778 13.771 13.823 13.659

a2:5.181 7.747 8.314 8.061 7.920 8.153 8.540 8.845 7.881 8.301

b1、c1、およびd1にa1データを使用しました。ここのb2、c2、d2のa2データ。

図:

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

コード:

        op=par(mfrow=c(4,1), mar=c(5.5,5.1,4.1,2.1))
        plot(a1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="A")
        lines(a2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
        par(xpd=T)
        legend(1,26.5,c("X","Y"),bty="n",horiz=T,cex=1.5,col=c("red1","darkblue"),text.col=c("red1","darkblue"),pch=c(1,3),lty=c(2,3),x.intersp=0.4,adj=0.2)
        plot(b1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="B")
        lines(b2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
        plot(c1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="C")
        lines(c2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
        plot(d1/1000, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="D")
        lines(d2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
   > mtext("Price", side=2, at=100,line=3,cex=1.1)

1
データの詳細を教えていただけますか?おそらく、dput(data_from_r)
suncoolsu

@suncoolsu、質問をデータのサンプルで更新しました。ありがとうございました。
サマラサ

凡例付きの同じ軸に2色と4つの線種がある場合はどうなりますか?そのためのコードと結果をご覧ください。
ポール

@ user87:4つのプロットは4つの異なる実験からのものです。したがって、4つのプロットを描いて実験の結果を分析する方が良いと思います。
サマラサ

@ user87、どういう意味かわかりません。おそらく、誰かが答えるだろう新しい質問を始めた場合(私は:))
ブランドンバーテルセン

回答:


16

あなたが使ってきた方法のようなものに固執したいなら、layout()コマンドを学びたいかもしれません。他のいくつかの詳細が変更され、グラフをより近づけることができます。また、リスト内のグラフ間で変化するユニークなもの(データやマージンなど)を入れてから、ループを実行することもできます。また、下の軸をdirect axis()コマンドで作成したことに注意してください。これにより、アイテムの移動先を制御できます。

layout(matrix(1:5, ncol = 1), widths = 1,
        heights = c(1,5,5,5,7), respect = FALSE)
par(mar=c(0, 4, 0, 0))
plot(1, type = 'n', axes = FALSE, bty = 'n', ylab = '')
legend('left', , c("X","Y"), bty="n", horiz=T, cex=1.5, col=c("red1","darkblue"), text.col=c("red1","darkblue"), pch=c(1,3), lty=c(2,3), x.intersp=0.4,adj=0.2)
par(mar=c(0, 4, 2, 1), bty = 'o')
plot(a1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", xaxt = 'n', cex.axis=1.4, cex.lab=1.3,cex=1.2, lwd=2.5, col="red1", lty=2, pch=1, main="A")
lines(a2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
par(xpd=T)
plot(b1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", xaxt = 'n', cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="B")
lines(b2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
plot(c1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", xaxt = 'n', cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="C")
lines(c2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
par(mar=c(4, 4, 2, 1))
plot(d1/1000, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", xaxt = 'n', cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="D")
lines(d2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
mtext("Price", side=2, at=40,line=2.5,cex=1.1)
axis(1, 1:10, cex.axis = 1.4)

プロット

これをできる限りうまく作成することに本当に努力しなかったことに注意する必要があります。最初のダミーグラフを作成する代わりに、最初のフレームに十分なスペースを設定することができました。残念ながら、mar()設定はフレームを埋めようとし、上マージンはグラフの上のラベルが離れている距離に影響を与えるので、ただ使用するのではなくmtext()またはtext()ですべてのラベルを作成する必要がありますプロット内のメイン設定と私はそれをする気がしませんでした


二番目に悪いassベースグラフィックスの+1。私は、layout()コマンドを使って何か良いことを書くことを無駄に試みました。次回使用するときにここに戻ってきます。
クリスビーリー

13

ラティスグラフィックパッケージを学ぶことをお勧めします。数行であなたが望むものに近づけることができます。まず、次のようなデータフレームにデータをパッケージ化します。

dat <- data.frame (x=rep (1:10, 8), y=c(a1, a2, b1, b2, c1, c2, d1, d2),
        var=factor (rep (c("X", "Y"), each=10)),
        graph=factor (rep (c("A", "B", "C", "D"), each=20)))

生成されるもの:

    x           y var graph
1   1 0.556372979   X     A
2   2 0.754257646   X     A
3   3 0.815432905   X     A
4   4 0.559513013   X     A
5   5 0.763368168   X     A
6   6 0.426415259   X     A
7   7 0.597962532   X     A
8   8 0.723780143   X     A
9   9 0.228920116   X     A
10 10 0.607378894   X     A
11  1 0.865114425   Y     A
12  2 0.919804947   Y     A
13  3 0.437003794   Y     A
14  4 0.203349303   Y     A
15  5 0.620425977   Y     A
16  6 0.703170299   Y     A
17  7 0.174297656   Y     A
18  8 0.698144659   Y     A
19  9 0.732527016   Y     A
20 10 0.778057398   Y     A
21  1 0.355583032   X     B
22  2 0.015765144   X     B
23  3 0.315004753   X     B
24  4 0.257723585   X     B
25  5 0.506324279   X     B
26  6 0.028634427   X     B
27  7 0.475360443   X     B
28  8 0.577119754   X     B
29  9 0.709063777   X     B
30 10 0.308695235   X     B
31  1 0.852567748   Y     B
32  2 0.938889121   Y     B
33  3 0.080869739   Y     B
34  4 0.732318482   Y     B
35  5 0.325673156   Y     B
36  6 0.378161864   Y     B
37  7 0.830962248   Y     B
38  8 0.990504039   Y     B
39  9 0.331377188   Y     B
40 10 0.448251682   Y     B
41  1 0.967255983   X     C
42  2 0.722894624   X     C
43  3 0.039523960   X     C
44  4 0.003774719   X     C
45  5 0.218605160   X     C
46  6 0.722304874   X     C
47  7 0.576140686   X     C
48  8 0.108219812   X     C
49  9 0.258440127   X     C
50 10 0.739656846   X     C
51  1 0.528278201   Y     C
52  2 0.104415716   Y     C
53  3 0.966076056   Y     C
54  4 0.504415150   Y     C
55  5 0.655384900   Y     C
56  6 0.247340395   Y     C
57  7 0.193857228   Y     C
58  8 0.019133583   Y     C
59  9 0.799404908   Y     C
60 10 0.159209090   Y     C
61  1 0.422574508   X     D
62  2 0.823192614   X     D
63  3 0.808715876   X     D
64  4 0.770499188   X     D
65  5 0.049138399   X     D
66  6 0.747017767   X     D
67  7 0.239916970   X     D
68  8 0.152777362   X     D
69  9 0.052862276   X     D
70 10 0.937605577   X     D
71  1 0.850112019   Y     D
72  2 0.675407232   Y     D
73  3 0.273276166   Y     D
74  4 0.455995477   Y     D
75  5 0.695497498   Y     D
76  6 0.688414035   Y     D
77  7 0.454013633   Y     D
78  8 0.874853452   Y     D
79  9 0.568746031   Y     D

次に、ラティスの xyplot

library (lattice)
xyplot (y ~ x | graph, groups=var, data=dat, type="o",
        layout=c(1, 4), as.table=T, xlab="Time (secs)", ylab="Price")

次のような素敵なグラフが生成されます。

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

編集:

異なるシンボルとラインを使用して凡例に表示する場合、文字通り凡例を自分で作成するため、複雑になります。自分でオーバーライドしなかった場合、デフォルトの格子色を取得する方法を知る必要があります:

my.text <- levels (dat$var)
my.lty <- c(2, 3)
my.pch <- c(1, 2)
my.col <- trellis.par.get ("superpose.symbol")$col[1:2]
xyplot (y ~ x | graph, groups=var, data=dat, type="o", pch=my.pch, lty=my.lty,
        main="Main Title", layout=c(1, 4), as.table=T, xlab="Time (secs)", ylab="Price",
        key=list (columns=2, text=list (my.text), points=list (pch=my.pch, col=my.col)))

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

編集2:

2つのカテゴリが「X」と「Y」のように単純な場合、コードとグラフを単純化できます。

xyplot (y ~ x | graph, groups=var, data=dat, type="o", pch=c("X", "Y"), cex=1.25, lty=c(2, 3),
        layout=c(1, 4), as.table=T, xlab="Time (secs)", ylab="Price")

ポイントシンボルとして「X」と「Y」を使用します。凡例はまったく必要なく、グラフ自体により多くのスペースを割り当てることができます。(一方で、見た目が気に入らないかもしれませんし、ポイントの正確な中心を特定するのが難しいかもしれませんが、ラインが各ポイントを通過するので、それほど問題ではありません。)

編集3:

実際strip=F, strip.left=T,には、A、B、C、Dのラベルをグラフの左側に配置するために、プロットに追加する必要があります。これにより、次のような長いグラフに余裕ができます。

xyplot (y ~ x | graph, groups=var, data=dat, type="o", pch=my.pch, lty=my.lty,
        main="Main Title", layout=c(1, 4), as.table=T, xlab="Time (secs)", ylab="Price",
        strip.left=T, strip=F,
        key=list (columns=2, text=list (my.text), points=list (pch=my.pch, col=my.col),
        lines=list (lty=my.lty, col=my.col)))

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


@ウェイン:auto.keyをspace = "top"、pch = c(1,2)、lty = c(2,4)引数を使用してグラフの上部に凡例を保持しようとしていますが、pch値とlty値が機能していません。さらに、凡例のXとYを水平に保ちたいと思います。これを手伝ってください。
サマラサ

はい。異なるpch値を使用して、紙のXとYを区別する必要があります。引数pch(1,4)をxyplotに追加することにより、プロットで異なるpch値を使用できますが、凡例には反映されません。凡例のXとYに異なるpch値を使用する方法を教えてください。
サマラサ

OK、家に帰って本を調べてみたらわかりました。編集したバージョンを確認してください。
ウェイン

問題ない。私のEDIT 3は、あなたのオリジナルに似た最高のグラフを提供すると思います(ただし、見た目が良く、グラフのスペースが大きくなります)。私は伝説を動かさなかったが、それはかなり簡単だと思う。凡例のポイントを通過させたい場合は、次の複雑さのレベルに持っていき、カスタムグロブを作成するdraw.keyを実行する必要があると思います(gridラティスとグリッド上のggplot2ビルド) 。
ウェイン

うん、今はグラフが良くなりました。ただし、通常のプロット関数を使用する場合のように、凡例のライン上にポイントを取得する場合は、本当に良いでしょう。
サマラサ

9

以下にggplot2、目的の凡例の動作を組み込んだ@Brandonのソリューションのバージョンを示します。

dat <- data.frame (x=rep (1:10, 8), y=runif(80),
        var=factor (rep (c("X", "Y"), each=10)),
        graph=factor (rep (c("A", "B", "C", "D"), each=20)))

ggplot(data = dat,aes(x = x, y = y)) + 
    facet_wrap(~graph,nrow = 4) + 
    geom_point(aes(shape = var)) + 
    geom_line(aes(colour = var, group = var)) + 
    labs(x = NULL, y = NULL, shape = "", colour = "") + 
    theme_bw() + 
    opts(legend.position = "top", legend.direction = "horizontal")

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

私は伝説がはるかに簡単でggplot2あることがわかりましたが、YMMVです。

編集

コメント内のいくつかの質問に対処します。特定の点や線の種類を指定するには、使用するscale_aesthetic_manual場所aestheticのいずれかであるshapelinetypeたとえばなど、:

ggplot(data = dat,aes(x = x, y = y)) + 
    facet_wrap(~graph,nrow = 4) + 
    geom_point(aes(shape = var)) + 
    geom_line(aes(colour = var, linetype = var, group = var)) + 
    labs(x = NULL, y = NULL, shape = "", colour = "", linetype = "") + 
    scale_shape_manual(values = 4:5) +
    theme_bw() + 
    opts(legend.position = "top", legend.direction = "horizontal")

さまざまな軸ラベルのサイズを変更するには、通常はを使用してテーマの設定を変更しますopts()。例えば:

ggplot(data = dat,aes(x = x, y = y)) + 
    facet_wrap(~graph,nrow = 4) + 
    geom_point(aes(shape = var)) + 
    geom_line(aes(colour = var, linetype = var, group = var)) + 
    labs(x = "X Label", y = "Y Label", shape = "", colour = "", linetype = "") + 
    theme_bw() + 
    opts(legend.position = "top", legend.direction = "horizontal",
         axis.text.x = theme_text(size = 15),axis.title.y = theme_text(size = 25, angle = 90))

詳細については、Webサイトと彼の本を実際にご覧ください。


2
私はしばしばggplot2を好みます。実際、ラティスが複雑になりすぎているときにggplot2を簡単に試してみましたが、シェイプとラインスタイルを明示的に選択したい場合、凡例にポイント/ラインスタイルを適切に反映させることができないことがわかりました。私はおそらくそれを間違った方法で行い、グラフでうまく動作しましたが、ggplotの伝説の作成をだましました。それがあなたのために働くかどうかを見て、コードを投稿できますか?
ウェイン

@Joran:線種と点種、色を変更しようと試みましたが、成功しませんでした。線種などを変更する方法を教えてください。また、xおよびyラボのサイズを大きくする方法を教えてください。
サマラサ

現時点では、電話を使用しています。あなたが探しているもので家に帰る前に@Brandonが彼の答えを編集しなければ、今夜遅くにそれを取ります。
ジョラン

8

ウェインの答えと同様に、別のパッケージも使用します。つまり、 ggplot2

library(ggplot2) 

df <- data.frame(
parameter=runif(300),
Time=1:300,
split=sample(c(1:4),300,replace=T),
split2=sample(c(1:2),300,replace=T)
)

ggplot(df, aes(Time, parameter, colour=as.factor(split2))) + 
geom_line() + 
facet_wrap(~split,nrow=4)

次のようなグラフが表示されます。

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


1
ggplotのグリッドが好きですが、明るい灰色の背景をオフにする方法はありますか?
ブルーポール

1
+ opts(panel.background=theme_blank())
ブランドンバーテルセン

1
他の変更を行う場合は、入力theme_get()して変更できる内容を確認できます。次に、前回のコメントと同じパターンに従って、それらを設定します=theme_blank()
ブランドンバーテルセン

2
私は自分でggplot2を実行するつもりでしたが、おそらく格子がより簡単なステップになると考えました。どちらも、このようなグラフを積み重ねる構造化された方法を提供します。多くの詳細を微調整するのは難しいかもしれませんが、魅力的で読みやすいものをすばやく取得するのは簡単です。(データをグラフに投げ込むのではなく、データをグラフ化するための適切なデータフレームを作成する必要があります
ウェイン

Hadleyが他のパッケージでデータを適切な形にマッサージするためのデータ操作ツールを提供していることがわかりました。疑問がある場合、答えは通常、melt()
ブランドンバーテルセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.