Rの同じプロットに2つのグラフをプロットする


571

y1とy2を同じプロットにプロットします。

x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
plot(x, y1, type = "l", col = "red")
plot(x, y2, type = "l", col = "green")

しかし、私がこのようにすると、それらは一緒に同じプロットにプロットされません。

Matlab hold onではこれを行うことができますが、誰でもRでこれを行う方法を知っていますか?


3
チェックしてください?curve。を使用しadd=TRUEます。
同型写像

より具体的なggplot2の回答については、この質問を参照してください。
Axeman 2018

回答:


617

lines()またはpoints()既存のグラフに追加されますが、新しいウィンドウは作成されません。だからあなたはする必要があります

plot(x,y1,type="l",col="red")
lines(x,y2,col="green")

10
次の簡単な例では機能しないのはなぜですか?> plot(sin)> lines(cos)as.double(y)のエラー:タイプ 'builtin'をタイプ 'double'のベクトルに強制変換できません
Frank

23
見やすいです。plot(sin)では、実際のデータの代わりに関数を渡します。plot()はこれを検出し、次にplot.function()を使用して関数をプロットします(これについて詳しくは、複数のディスパッチについて読んでください)。ただし、lines.function()は定義されていないため、lines()はクラス関数のパラメーターをどうするかを認識していません。行は、クラスtsのデータと時系列オブジェクトのみを処理できます。
Soumendra 2013

27
@フランク次のようにしますplot(sin); curve(cos, add=TRUE)
同型写像

2
xが異なる場合に同じを使用する方法?たとえば、1つのグラフにx1とy1があり、同じグラフにx2とy2の別のグラフを追加するとします。x1とx2の両方の範囲は同じですが、値が異なります。
カビプリヤ2015年

1
それはまったく同じです。lines(x2,y2,...)代わりにlines(x,y2,...)
bnaul 2015年

220

par同じグラフで異なる軸にプロットすることもできます。次のようなもの:

plot( x, y1, type="l", col="red" )
par(new=TRUE)
plot( x, y2, type="l", col="green" )

あなたはについて詳細に読めばparR、あなたは本当に面白いグラフを生成することができるようになります。注目すべきもう1つの本は、Paul MurrelのRグラフィックです。


3
私のRからエラーが返されます:エラー(par(fig(new = TRUE))内):関数 "fig"が見つかりませんでした
アレッサンドロジャコプソン

5
あなたの方法は2つのプロットの正しいスケール(y軸)を保持していますか?
アレッサンドロジャコプソン

1
@uvts_cvsはい、元のグラフをそのまま保持します。
サム

10
これに関する問題は、いくつかのプロット要素を書き換えることです。xlab="", ylab="", ...2番目には、他にもいくつかを含めますplot
同型

118

多層プロットを作成するときは、ggplotパッケージを検討する必要があります。アイデアは、基本的な美学を備えたグラフィカルオブジェクトを作成し、それを段階的に強化することです。

ggplotスタイルでは、データをにパックする必要がありますdata.frame

# Data generation
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
df <- data.frame(x,y1,y2)

基本的な解決策:

require(ggplot2)

ggplot(df, aes(x)) +                    # basic graphical object
  geom_line(aes(y=y1), colour="red") +  # first layer
  geom_line(aes(y=y2), colour="green")  # second layer

ここで+ operatorは、基本オブジェクトにレイヤーを追加するために使用されます。

を使用ggplotすると、プロットのすべての段階でグラフィカルオブジェクトにアクセスできます。たとえば、通常の段階的な設定は次のようになります。

g <- ggplot(df, aes(x))
g <- g + geom_line(aes(y=y1), colour="red")
g <- g + geom_line(aes(y=y2), colour="green")
g

gプロットが作成され、すべての段階で表示されます(少なくとも1つのレイヤーの作成後)。プロットのさらなるエンチャントも作成されたオブジェクトで行われます。たとえば、軸のラベルを追加できます。

g <- g + ylab("Y") + xlab("X")
g

最終的にgは次のようになります。

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

更新(2013-11-08):

コメントで指摘されているように、ggplotの哲学は、長い形式のデータを使用することを提案しています。対応するコードを確認するには、この回答を参照してください。


5
以下のようヘンリクによって提案され、データが実際に「長い」の形式である必要があり、ggplotあなたが使う「ワイド」形式よりも、このより自然に処理します。
krlmlr 2013

1
@ヘンリック:いいえ、そもそも答えてくれてありがとう。おそらく、この回答の作成者はそれを編集して、ggplotの哲学にうまく適合するようにすることができます...
krlmlr

1
@krlmlr、私は自分の回答を編集して、より明確に質問に対処できるようにしました。更なるアップデートを提案してください。乾杯。
Henrik

3
ggplot(aes())でxを定義し、geom _ *()でyを単独で定義することを教えてくれました。いいね!
Dan

41

私はあなたが探している答えは次のとおりだと思います:

plot(first thing to plot)
plot(second thing to plot,add=TRUE)

25
これは機能していないようです。"add" is not a graphical parameter警告が表示され、最初のプロットの上に2番目のプロットが印刷されます。
Waldir Leoncio 2014

8
@WaldirLeoncioは、stackoverflow.com
アレッサンドロ

これの1つの素晴らしい利点は、Axesの制限とタイトルの一貫性を保つように見えることです。以前のいくつかの方法では、さらにオプションを指定する手間をかけない限り、Rはy軸に2セットの目盛りを描画します。言うまでもなく、軸に2セットの目盛りがあると非常に誤解を招く可能性があります。
RMurphy 2017

1
addパラメータは一部のプロットメソッドでは機能しますが、Rのbase / defaultでは機能しません
cloudscomputes

2
同じエラーが発生しました"add" is not a graphical parameter。私のRはR version 3.2.3 (2015-12-10)です。par(new=TRUE)これらのプロット間でコマンドを使用できます。
quepas 2017年

29

matplot関数を使用します。

matplot(x, cbind(y1,y2),type="l",col=c("red","green"),lty=c(1,1))

場合は、これを使うy1y2同じで評価されているxポイント。Y軸を拡大して、どちらか大きい方(y1またはy2)に合わせます。これy2より大きくなるとクリップする他の回答の一部とは異なりますy1(ggplotソリューションはほとんどこれで問題ありません)。

または、2つの線が同じx座標を持たない場合は、最初のプロットに軸の範囲を設定し、以下を追加します。

x1  <- seq(-2, 2, 0.05)
x2  <- seq(-3, 3, 0.05)
y1 <- pnorm(x1)
y2 <- pnorm(x2,1,1)

plot(x1,y1,ylim=range(c(y1,y2)),xlim=range(c(x1,x2)), type="l",col="red")
lines(x2,y2,col="green")

アムは、このQは4歳で、誰も言及していない驚いmatplotたりx/ylim...


25

tl; dr:(curveadd=TRUE)またはを使用したいlines


par(new=TRUE)目盛りと軸ラベルが二重に印刷されるため、同意しません。例えば

サインと放物線

の出力plot(sin); par(new=T); plot( function(x) x**2 )

縦軸のラベルがいかに台無しになっているか見てください!範囲が異なっているので、あなたが設定する必要がありますylim=c(lowest point between the two functions, highest point between the two functions)私はあなたが表示されるまでにだ何よりも簡単です---そしてその、あなただけではなく二つの曲線が、多くを追加したい場合は簡単に少ないです。


何いつもプロットについて私に混乱することの違いであるcurvelinesこれらの2つの重要なプロットコマンドの名前があることをあなたは覚えていない場合は(ちょうど歌いますてください。)

との大きな違いは次のcurveとおりlinesです。

curveのような関数をプロットしますcurve(sin)lines次のように、xとyの値でポイントをプロットしますlines( x=0:10, y=sin(0:10) )

そして、ここに小さな違いがあります。既存のプロットに追加することをすでに想定している一方で、実行しようcurveとしadd=TRUEていることのために呼び出す必要がありlinesます。

IDとサイン

を呼び出した結果は次のとおりplot(0:2); curve(sin)です。


舞台裏で、チェックしてくださいmethods(plot)。そして、チェックしてくださいbody( plot.function )[[5]]plot(sin)R を呼び出すsinと、それが関数(y値ではない)であることがわかり、plot.functionメソッドを使用して、を呼び出しcurveます。それでcurve、関数を処理するためのツールです。



16

@redmodeで説明されているように、を使用して、同じグラフィックデバイスで2つの線をプロットできますggplot。その回答では、データは「ワイド」フォーマットでした。ただし、使用ggplotする場合、データフレーム内のデータを「長い」形式で保持するのが一般的に最も便利です。次に、別の「グループ化変数」を使用してaes thetics引数で、線種や色などの線のプロパティがグループ化変数に応じて変化し、対応する凡例が表示されます。

この場合、colourラインの色をデータセット内の変数のさまざまなレベル(ここではy1とy2)に一致させる美学を使用できます。しかし、最初に、たとえばreshape2パッケージから関数「melt」を使用して、データをワイドフォーマットからロングフォーマットに溶かす必要があります。データを再形成する他の方法については、ここで説明します。data.frameをワイドフォーマットからロングフォーマットに変形する

library(ggplot2)
library(reshape2)

# original data in a 'wide' format
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
df <- data.frame(x, y1, y2)

# melt the data to a long format
df2 <- melt(data = df, id.vars = "x")

# plot, using the aesthetics argument 'colour'
ggplot(data = df2, aes(x = x, y = value, colour = variable)) + geom_line()

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


15

ベースグラフィックス(つまり、ラティス/グリッドグラフィックスではない)を使用している場合、ポイント/ライン/ポリゴン関数を使用してMATLABのホールド機能を模倣し、新しいプロットを開始せずにプロットに詳細を追加できます。マルチプロットレイアウトの場合、を使用par(mfg=...)して、追加するプロットを選択できます。



7

プロットする値を配列に保持するのではなく、それらを行列に格納します。デフォルトでは、マトリックス全体が1つのデータセットとして扱われます。ただし、行列に行があるため、プロットに同じ数のモディファイアを追加する場合(col()など)、Rは各行を個別に処理する必要があることを理解します。例えば:

x = matrix( c(21,50,80,41), nrow=2 )
y = matrix( c(1,2,1,2), nrow=2 )
plot(x, y, col("red","blue")

これは、データセットのサイズが異なる場合を除いて機能します。


これは次のようになります:if(as.factor){のエラー:引数は論理として解釈できません
baouss

5

慣用的なMatlab plot(x1,y1,x2,y2)ggplot2、たとえば次のようにRで翻訳できます。

x1 <- seq(1,10,.2)
df1 <- data.frame(x=x1,y=log(x1),type="Log")
x2 <- seq(1,10)
df2 <- data.frame(x=x2,y=cumsum(1/x2),type="Harmonic")

df <- rbind(df1,df2)

library(ggplot2)
ggplot(df)+geom_line(aes(x,y,colour=type))

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

ggplot2を使用して、異なる範囲のx軸を持つThating Zhaoのデュアルラインプロットに触発されました


5

あなたは使用することができますggplotly()から機能をplotlyのいずれかオンにするパッケージgggplot2のインタラクティブなプロットに、ここでの例を、私はプロットのこの種がなくて優れていると思うggplot2

# call Plotly and enter username and key
library(plotly)
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)

plot_ly(x = x) %>%
  add_lines(y = y1, color = I("red"), name = "Red") %>%
  add_lines(y = y2, color = I("green"), name = "Green")

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


ずんぐりした見栄えがします。無料なの ?
denis

@denis、無制限の無料の公共プロットと有料の民間プロットまたはオンプレミスのオプションがあります。参照計画のページを
マテオサンチェス

4
plotly Rパッケージは100%フリーでオープンソース(MITライセンス)です。plotlyアカウントの有無にかかわらず使用できます。
カーソン

4

ggvisを使用してプロットを作成することもできます。

library(ggvis)

x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
df <- data.frame(x, y1, y2)

df %>%
  ggvis(~x, ~y1, stroke := 'red') %>%
  layer_paths() %>%
  layer_paths(data = df, x = ~x, y = ~y2, stroke := 'blue')

これにより、次のプロットが作成されます。

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


2

使用plotlyplotlyプライマリおよびセカンダリy軸からのソリューションの追加-不足しているようです):

library(plotly)     
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)

df=cbind.data.frame(x,y1,y2)

  plot_ly(df) %>%
    add_trace(x=~x,y=~y1,name = 'Line 1',type = 'scatter',mode = 'lines+markers',connectgaps = TRUE) %>%
    add_trace(x=~x,y=~y2,name = 'Line 2',type = 'scatter',mode = 'lines+markers',connectgaps = TRUE,yaxis = "y2") %>%
    layout(title = 'Title',
       xaxis = list(title = "X-axis title"),
       yaxis2 = list(side = 'right', overlaying = "y", title = 'secondary y axis', showgrid = FALSE, zeroline = FALSE))

デモのスクリーンショット:

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


コードをコンパイルして動作しません。最初に%>%でエラーをマークし、それを削除してから、エラーをマークしましError in library(plotly) : there is no package called ‘plotly’た。なぜですか?
Bellatrix

パッケージをインストールしましたplotlyか?install.packages("plotly")コマンドを使用してパッケージをインストールする必要があります。
Saurabh Chauhan

1

ラティスライブラリを使用することもできます

library(lattice)
x <- seq(-2,2,0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
xyplot(y1 + y2 ~ x, ylab = "y1 and y2", type = "l", auto.key = list(points = FALSE,lines = TRUE))

特定の色について

xyplot(y1 + y2 ~ x,ylab = "y1 and y2", type = "l", auto.key = list(points = F,lines = T), par.settings = list(superpose.line = list(col = c("red","green"))))

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.