2011-07-28 8 views
17

これはthis questionのフォローアップです。複数の曲線を同じグラフと同じスケールでプロットする

私は同じグラフ上に複数の曲線をプロットしたいが、私の新しい曲線は最初の曲線によって生成された同じy軸スケールを尊重するようにしたい。

注意次の例:(Iは第2のプロットを使用して作成される新しいy軸を隠すだから)、実際にグラフの同一座標上の値の両方のセットをプロット

y1 <- c(100, 200, 300, 400, 500) 
y2 <- c(1, 2, 3, 4, 5) 
x <- c(1, 2, 3, 4, 5) 

# first plot 
plot(x, y1) 

# second plot 
par(new = TRUE) 
plot(x, y2, axes = FALSE, xlab = "", ylab = "") 

私の質問は、2番目のグラフをプロットするときに同じy軸スケールを維持する方法です。

+1

です。あなたが望むもののグラフィックが助けになるでしょう... –

+0

Manoelのコメントに追加するだけで、y値の2番目のセットは最初のものの範囲外です。あなたは彼らがどこにプロットされると思いますか? – joran

+0

@Manoel:それは私が実際に探しているものです... – Renan

答えて

30

をプロットlinesを別のシリーズに追加する場合)plotを複数回使用してpar(new=TRUE)を使用するには、最初のプロットにすべてのシリーズを受け入れるために適切なylimがあることを確認する必要があります(別の状況では、 xlim):

# first plot 
plot(x, y1, ylim=range(c(y1,y2))) 

# second plot EDIT: needs to have same ylim 
par(new = TRUE) 
plot(x, y2, ylim=range(c(y1,y2)), axes = FALSE, xlab = "", ylab = "") 

enter image description here

この次のコードは、デフォルトでは、あなたはポイントとして数字を得るが、もう一つはあなたの典型的なR-タイプ - 「ポイント」を与え、よりコンパクトに作業を行います。

matplot(x, cbind(y1,y2)) 
    matplot(x, cbind(y1,y2), pch=1) 
+0

yの値の2番目の値は1:5ではないでしょうか? – joran

+0

ええ、これは動作していません。あなたはこれらの点が同じy軸スケールで表されていないことを見ることができます。そうでなければ2は100より大きいでしょう:... – Renan

+0

OOOPs: –

1

私はあなたが何を望んでいるか分かりませんが、私は格子を使用します。そして

x = rep(x,2) 
y = c(y1,y2) 
fac.data = as.factor(rep(1:2,each=5)) 
df = data.frame(x=x,y=y,z=fac.data) 
# this create a data frame where I have a factor variable, z, that tells me which data I have (y1 or y2) 

だけ(典型的な方法は、結合されたすべての一連の範囲を含むように、おそらく、限界を設定し、次にpointsを使用する一度だけplotを使用することであろう

xyplot(y ~x|z, df) 
# or maybe 
xyplot(x ~y|z, df) 
+4

または 'xyplot(y〜x、groups = z、df)'。新しい 'data.frame'を作成せずに:' xyplot(y1 + y2〜x) '。 – Marek

+0

私はそれを知っていますが、私はそれを使用したことはありません!たぶん私はそれを試してみるべきです。ポインタの+1。 –

5

あなたのサンプルコードでは、@ DWinが技術的に正しいと思っているので、あなたがここで何を望んでいるかについてはあまり明確ではありません。

y1 <- c(100, 200, 300, 400, 500) 
y2 <- c(1, 2, 3, 4, 5) 
x <- c(1, 2, 3, 4, 5) 

# first plot 
plot(x, y1,ylim = range(c(y1,y2))) 

# Add points 
points(x, y2) 

DWINのソリューションは、あなたがポイントの第2のセットをプロットしたいと(自分のコード例に基づいて)暗黙の前提の下で動作していた、元の規模でをオーバーレイ:私は何本当にがしたいことはこれですが思います。だから、彼の画像は、ポイントが1、101などでプロットされているように見えます。plotを2回目に呼び出すと、にはpointsを使用してを追加します。だから、私のマシンで上記のコードは、これを生成します。

enter image description here

しかしylimの使用に関するDWINの主なポイントは正しいです。

+0

あなたへのお知らせ両方の上で同じylimを使用することによって、私のy問題を修正しました。おそらく、回顧的にポイントを使用したはずです。 –

+0

範囲に 'c'は必要ありません。 'range(y1、y2)'で十分です。 – Marek

6

pointsまたはlines場合

  • y2便利来るが、新たなデータが同じxを持っていないが、それでも同じ座標系に行くべき後に発生した、または
  • されます。あなたのyのシェアとして

同じx、あなたもmatplotを使用することができます。

matplot (x, cbind (y1, y2), pch = 19) 

matplot (x, cbind (y1, y2), pch = 19)

pchmatploptせずに列y行列の番号の代わりにドットをプロットします)。

+0

+1私はあなたが私の前にマトプロット戦略に転じたのを見ます。 –

+0

黒い点と赤い点にそれぞれy1とy2で注釈を付けるにはどうすればよいですか? – dacongy

+0

@dacongy: 'pch'は、y行列の各列に対して1文字の記号(" A "と" B "または" 1 "と" 2 "など)を受け入れます。長いテキストが本当に必要な場合は、AFAIKの各列に 'text'を使用する必要があります(またはマットテキスト関数を書く;-)) – cbeleites

3

私の解決方法はggplot2です。それは自動的にこれらのタイプのものを処理します。最も重要なことは、データを適切に整理することです。

y1 <- c(100, 200, 300, 400, 500) 
y2 <- c(1, 2, 3, 4, 5) 
x <- c(1, 2, 3, 4, 5) 
df <- data.frame(x=rep(x,2), y=c(y1, y2), class=c(rep("y1", 5), rep("y2", 5))) 

そしてそれ

library(ggplot2) 
ggplot(df, aes(x=x, y=y, color=class)) + geom_point() 

これはdfのプロットにデータを言っているプロットするggplot2を使用し、classによってポイントを分離します。

生成されたプロットは、私が何をしたいかわからないenter image description here