web-dev-qa-db-ja.com

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

同じプロットで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でこれを行う方法を誰かが知っていますか?

499

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

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

parを使用して、同じグラフで異なる軸にプロットすることもできます。次のようなものがあります。

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

parRについて詳しく読むと、本当に興味深いグラフを生成することができます。もう1冊の注目点は、Paul MurrelのRグラフィックです。

194
Sam

多層プロットを作成するときは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は次のようになります。

enter image description here

更新(2013-11-08):

コメントで指摘されているように、ggplotの哲学は長いフォーマットでデータを使うことを提案します。対応するコードを見るためにこの回答を参照することができます https://stackoverflow.com/a/19039094/1796914

104
redmode

私はあなたが探している答えはそれだと思います:

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

matplot関数を使用してください。

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

y1y2が同じxポイントで評価される場合はこれを使用してください。 y1よりも大きい場合はy2を切り取る他のいくつかの回答とは異なり、Y軸を大きい方(y2またはy1)に合わせてY軸を拡大/縮小します(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歳で、誰もmatplotx/ylim...を言及していないことに驚いています。

25
Spacedman

tl; dr: curveadd=TRUE付き)またはlinesを使用します。


par(new=TRUE)には同意しません。なぜなら、これは目盛りと軸ラベルを二重に印刷するからです。例えば

sine and parabola

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

縦軸のラベルがめちゃくちゃになっているのを見てください。範囲が異なるため、ylim=c(lowest point between the two functions, highest point between the two functions)を設定する必要があります。これは、これから説明するものほど簡単ではありません。2つの曲線だけでなく、多くの場合はway簡単ではありません。 。


プロットについて私をいつも混乱させているのは、curvelinesの違いです。 (これらが2つの重要な描画コマンドの名前であることを覚えていない場合は、 sing itと入力してください。

これがcurvelinesの大きな違いです。

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

ちょっと違います:curveはあなたがやろうとしていることのためにadd=TRUEで呼ばれる必要がありますが、linesは既にあなたが既存のプロットに追加すると仮定しています。

id & sine

これはplot(0:2); curve(sin)を呼び出した結果です


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

23
isomorphismes

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

この場合、線の色をデータセット内のさまざまなレベルの変数に一致させる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()

enter image description here

16
Henrik

基本グラフィックス(格子/グリッドグラフィックスではない)を使用している場合は、points/lines/polygons関数を使用して新しいプロットを開始せずにプロットに詳細を追加することで、MATLABの機能を模倣できます。マルチプロットレイアウトの場合は、par(mfg=...)を使って追加するプロットを選ぶことができます。

15
mcabral

画面を分割したい場合は、次のようにします。

(例えば、2つのプロットを並べて表示する場合など)

par(mfrow=c(1,2))

plot(x)

plot(y) 

リファレンスリンク

14
Hamed2005

オーバープロットにポイントを使うことができます。

plot(x1, y1,col='red')

points(x2,y2,col='blue')
12
brainstorm

プロットされる値を配列に保持するのではなく、それらを行列に格納します。デフォルトでは、行列全体が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")

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

7
cranberry

慣用的な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))

enter image description here

Tingting Zhaoによる x軸の範囲が異なる二重線プロットggplot2を使用

5

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')

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

enter image description here

4
epo3

plotlyパッケージのggplotly()関数を使用して、ここで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")

enter image description here

3
Mateo Sanchez

ラティスライブラリも使用できます

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"))))

enter image description here

1
Varn K

plotlyを使う(一次と二次のy軸でplotlyから解を追加する - それは欠けているようです):

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))

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

enter image description here

1
Saurabh Chauhan