ggplot2: 複数の関数をplotして比較する
関数のパラメータを変えながら,そのplotを比較したい,という場面に日々遭遇します. 例えば平均の異なる正規分布の密度関数を比較したい場合,Mathematica(というウルフラム社の数式処理ソフト)なら,
Plot[{ PDF[NormalDistribution[0, 1], x], PDF[NormalDistribution[1, 1], x], PDF[NormalDistribution[2, 1], x]}, {x, -6, 6}]
でOKです.
凡例が欲しければ,Plot関数のオプションに
PlotLegends -> "Expressions"
と指定します.
え?これだけ?というくらい簡単です.
同じことをR
でやってみましょう*1.
R上での関数のplot
もっとも簡単なコードとして
curve(dnorm(x),-4,4)
を試してみます.
ファイルとして出力するには
png("hoge/pics.png") curve(dnorm(x),-4,4) dev.off()
です.hogeディレクトリにpics.pngが保存されます *2 .
複数の関数を1つの図に重ねてplotしましょう.par(new=TRUE)
でplotを上に重ねて書きます.
curve(dnorm(x),-4,4) par(new=TRUE) curve(dnorm(x,1,1),-4,4)
グラフを較べる目的ならこれで十分でしょう. 縦軸ラベルの重なりが気になる場合は片方のラベルを消します.
curve(dnorm(x),-4,4) par(new=TRUE) curve(dnorm(x,1,1),-4,4,ylab="")
線種を変えて,凡例もつけましょう.
curve(dnorm(x),-4,4,lty=1) par(new=TRUE) curve(dnorm(x,1,1),-4,4,lty=2,ylab="") legend("topright",legend=c("mean=0","mean=1"),lty=c(1,2))
見やすくなりました.
ggplot2をつかう
ggplot2を使って,グラフの見た目を調整します.
library("ggplot2") x <- seq(-4,5,0.1) m0 <- dnorm(x,0,1) m1 <- dnorm(x,1,1) data <- data.frame(x=x,y1=m0,y2=m1) ggplot(data,aes(x))+ geom_line(aes(y=y1))+ geom_line(aes(y=y2),linetype="dashed")
基本的な方針は以下のとおりです.
- 独立変数のベクトル
x
をつくる dnorm(x,0,1)
の出力をベクトルm0
に代入dnorm(x,1,1)
の出力をベクトルm1
- 上記のベクトルを
data.frame
にまとめる geom_line( )
をで曲線をplotする
以上です.ラベルが不要であれば
+theme(axis.title=element_blank( ) )
で消去します.このときxlab=" "
等を使うと余分な空白が入るので,axis.title=element_blank( ) )
を使うとよいでしょう.
背景のグレーが不要ならtheme_bw( )
を使って,背景を白黒印刷用に白くします.
以上をまとめためのが,次のコードです
ggplot(data,aes(x))+ geom_line(aes(y=y1))+ geom_line(aes(y=y2),linetype="dashed")+ theme_bw() +theme(axis.title=element_blank(),text=element_text(size=9))
以上です.もっと簡単な方法が分かれば,メモを更新します.