同じプロットで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でこれを行う方法を誰かが知っていますか?
lines()
またはpoints()
は既存のグラフに追加しますが、新しいウィンドウは作成しません。だからあなたはする必要があるでしょう
plot(x,y1,type="l",col="red")
lines(x,y2,col="green")
par
を使用して、同じグラフで異なる軸にプロットすることもできます。次のようなものがあります。
plot( x, y1, type="l", col="red" )
par(new=TRUE)
plot( x, y2, type="l", col="green" )
par
のR
について詳しく読むと、本当に興味深いグラフを生成することができます。もう1冊の注目点は、Paul MurrelのRグラフィックです。
多層プロットを作成するときは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
の哲学は長いフォーマットでデータを使うことを提案します。対応するコードを見るためにこの回答を参照することができます https://stackoverflow.com/a/19039094/1796914 。
私はあなたが探している答えはそれだと思います:
plot(first thing to plot)
plot(second thing to plot,add=TRUE)
matplot
関数を使用してください。
matplot(x, cbind(y1,y2),type="l",col=c("red","green"),lty=c(1,1))
y1
とy2
が同じ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歳で、誰もmatplot
やx/ylim
...を言及していないことに驚いています。
tl; dr: curve
(add=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)
を設定する必要があります。これは、これから説明するものほど簡単ではありません。2つの曲線だけでなく、多くの場合はway簡単ではありません。 。
プロットについて私をいつも混乱させているのは、curve
とlines
の違いです。 (これらが2つの重要な描画コマンドの名前であることを覚えていない場合は、 sing itと入力してください。
curve
とlines
の大きな違いです。curve
はcurve(sin)
のように関数をプロットします。 lines
は、lines( x=0:10, y=sin(0:10) )
のようにxとyの値でポイントをプロットします。
ちょっと違います:curve
はあなたがやろうとしていることのためにadd=TRUE
で呼ばれる必要がありますが、lines
は既にあなたが既存のプロットに追加すると仮定しています。
これはplot(0:2); curve(sin)
を呼び出した結果です
舞台裏ではmethods(plot)
をチェックしてください。そしてbody( plot.function )[[5]]
をチェックしてください。 plot(sin)
を呼び出すと、sin
は関数(yの値ではない)であることがわかり、plot.function
メソッドを使用します。これにより、curve
が呼び出されます。だからcurve
は関数を扱うためのツールです。
@redmodeで説明されているように、ggplot
を使用して同じグラフィカルデバイスに2本の線をプロットできます。その答えでは、データは「ワイド」フォーマットでした。ただし、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()
基本グラフィックス(格子/グリッドグラフィックスではない)を使用している場合は、points/lines/polygons関数を使用して新しいプロットを開始せずにプロットに詳細を追加することで、MATLABの機能を模倣できます。マルチプロットレイアウトの場合は、par(mfg=...)
を使って追加するプロットを選ぶことができます。
オーバープロットにポイントを使うことができます。
plot(x1, y1,col='red')
points(x2,y2,col='blue')
プロットされる値を配列に保持するのではなく、それらを行列に格納します。デフォルトでは、行列全体が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")
データセットのサイズが異なる場合を除き、これは機能します。
慣用的な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))
Tingting Zhaoによる x軸の範囲が異なる二重線プロットggplot2を使用 。
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')
これにより次のプロットが作成されます。
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")
ラティスライブラリも使用できます
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"))))
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))
実演デモのスクリーンショット: