Help us understand the problem. What is going on with this article?

正規分布など好きな関数の曲線を描きたい

More than 3 years have passed since last update.

Q.

正規分布とか二次曲線とか好きな関数の曲線を描きたいのですが。

A.

基本

stat_functionを使うのがお手軽です。

OK_example1.R
library(ggplot2)

p <- ggplot(data=data.frame(X=c(-4,4)), aes(x=X))
p <- p + stat_function(fun=dnorm)
p <- p + stat_function(fun=dnorm, args=list(mean=2, sd=.5))
p <- p + stat_function(fun=function(x) 0.01*x^2-0.1)

ggplotで描画範囲を指定して、stat_functionfun=で関数を指定します。関数に引数がある場合はargs=listを渡します。
OK1.png

例外: 関数ごとに描画範囲が異なる場合

geom_pathを使います。

OK_example2.R
library(ggplot2)

p <- ggplot()
p <- p + geom_path(data=data.frame(X=x<-seq(-2,2,len=101), Y=dnorm(x)), aes(x=X,y=Y))
p <- p + geom_path(data=data.frame(X=x<-seq(-3,3,len=101), Y=dnorm(x, mean=2, sd=.5)), aes(x=X,y=Y))
p <- p + geom_path(data=data.frame(X=x<-seq(-4,4,len=101), Y=0.01*x^2-0.1), aes(x=X,y=Y))

X軸の値とY軸の値を持つdata.frameを作ってgeom_pathに渡して線分がつながったものとして描画します。上のコード例ではgeom_path内でxに値を代入しつつdata.frameにしているおかげで、後ろのdnormでそのxを使える点に注意です。

OK2.png

応用編: パラメータの値を振った関数を重ねて描く

複数のggplot2要素を関数で渡したいを参考にします。
まずはガンマ分布のshapeパラメータを1,3、rateパラメータを0.5, 1, 2で振って描いた例です。

OK_example3.R
library(ggplot2)

ab <- expand.grid(a=c(1, 3), b=c(.5, 1, 2))
p <- ggplot(data.frame(X=c(0, 6)), aes(x=X)) +
  mapply(
    function(a, b, co) stat_function(fun=dgamma, args=list(shape=a, rate=b), aes_q(color=co)),
    ab$a, ab$b, sprintf("a=%.0f b=%.1f", ab$a, ab$b)
  )
p <- p + labs(color="parameter")

こういう時はmapplyを使うと便利なのでした。aesは凡例(legend)をつけるために設定しています。ただし、普通のaesではcoが列名と解釈されてしまうので、aes_qを使ってquoteされた文字列を渡せるようにしています。aes_qはggplot2の1.x系で新しく実装されたようです。

OK3.png

次にガンマ分布でshapeパラメータは5で固定して、rateパラメータを0.5~10で0.5刻みで変化させたものを描きます。

OK_example4.R
library(ggplot2)

b <- seq(.5, 10, by=.5)
p <- ggplot(data.frame(X=c(0, 6)), aes(x=X)) +
  mapply(
    function(a, b, co) stat_function(fun=dgamma, args=list(shape=a, rate=b), aes_q(color=co)),
    5, b, b
  )
p <- p + labs(color="b")

OK4.png

参考資料

http://docs.ggplot2.org/current/stat_function.html
http://d.hatena.ne.jp/dichika/20111117/1321491147
http://stackoverflow.com/questions/17649759/fitting-gaussian-to-data-geom-point-in-ggplot2/
http://docs.ggplot2.org/dev/aes_string.html

hoxo_b
hoxom
Machine Learning and Data Analysis Company for Your Smiles :)
http://hoxo-m.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした