LoginSignup
0
2

More than 5 years have passed since last update.

Rでちょっとだけ複雑なグラフをプロット(最大値にマーク、x軸と垂直に破線、矢印、グラフ中にテキスト、ライブラリshapeをインストール)

Last updated at Posted at 2018-10-23

作りたいグラフ

みどりぼん(データ解析のための統計モデリング入門)にあるグラフ。

shapeを使わない方
likelihood_2.png
shapeを使う方
likelihood_3.png

コード

以下のようにすればかける。

shapeを使わない方
# y用の関数
logL <- function(m) sum(dpois(data, m, log = TRUE))
# xデータ
lambda <- seq(2, 5, 0.1)
# プロット
plot(lambda, sapply(lambda, logL), type = "l")

# 最大値に該当するxを抽出
likelihood.max.x <- lambda[which.max(sapply(lambda, logL))]
# 最大値を抽出
likelihood.max.y <- max(sapply(lambda, logL))
# 最大値のプロット
points(likelihood.max.x,likelihood.max.y, pch=4)

# x軸と垂直な破線
abline(v=likelihood.max.x, lty=2)
# 矢印
arrows(4.0, -115, likelihood.max.x, -121)
# テキスト
text(4.1, -113, expression(hat(lambda)))
shapeを使う方
# shapeのインストールおよびインポート
install.packages("shape")
library(shape)

# y用の関数
logL <- function(m) sum(dpois(data, m, log = TRUE))
# xデータ
lambda <- seq(2, 5, 0.1)
# プロット
plot(lambda, sapply(lambda, logL), type = "l")

# 最大値に該当するxを抽出
likelihood.max.x <- lambda[which.max(sapply(lambda, logL))]
# 最大値を抽出
likelihood.max.y <- max(sapply(lambda, logL))
# 最大値のプロット
points(likelihood.max.x,likelihood.max.y, pch=4)

# x軸と垂直な破線
abline(v=likelihood.max.x, lty=2)
# 矢印
Arrows(4.0, -115, likelihood.max.x+0.1, -122+1, arr.type = "triangle") 
# テキスト
text(4.1, -113, expression(hat(lambda)))

説明(shapeパッケージを使わないバージョン)

最大値の抽出
# 最大値に該当するxを抽出
likelihood.max.x <- lambda[which.max(sapply(lambda, logL))]
# 最大値を抽出
likelihood.max.y <- max(sapply(lambda, logL))

which.maxは最大値に該当するインデックスを返す[1]
最大値になっているxの値を求めるたいので、xのデータであるlambdaのインデックスをwhich.maxで指定すれば良い。
maxは最大値を返すので、そのまま代入すれば良い。

x軸と垂直に破線
abline(v=likelihood.max.x, lty=2)

abline(v=x)またはabline(h=y)でx軸に垂直または水平に直線が引ける[2]

矢印作成
arrows(4.0, -115, likelihood.max.x, -122)

arrowsは(始点x, 始点y, 終点x, 終点y)の順[3]

テキストおよび数式
text(4.1, -113, expression(hat(lambda)))

テキストはtext(x, y, 内容)。今回はハットをつけてたλを出力したかったのでexpressionを用いている[4]

これで上記のプロットが出力される。
矢印がダサいのでライブラリをインポートしてそれっぽく見せてみる。

説明(shapeを使うバージョン)

shapeをインストールおよびインポート
install.packages("shape")
library(shape)

外部ライブラリを使うためにinstall.packagesを使ってインストールし、libraryを使って呼び出す[5]

shapeを使った矢印
Arrows(4.0, -115, likelihood.max.x+0.1, -122+1, arr.type = "triangle")

shapeを使った矢印は最初が大文字のArrowsを使えば良い。arr.typeで"triangle"を指定すればそれっぽい矢印になる。(詳細はshapeのマニュアル[6]を参照。)
また、今回の例では、"矢印が棒に三角形が組み合わさって矢印になっている"と考えた時の、棒の座標を指定している。
そこに三角形がたされるので、矢印で指している座標がずれてしまう。
そのために座標を微調整する必要があるので注意が必要。

参考文献

[1] https://qiita.com/stkdev/items/6aba2c1db2fa056170ae
[2] http://d.hatena.ne.jp/myopomme/20111222/1324551313
[3] http://cse.naro.affrc.go.jp/takezawa/r-tips/r/51.html
[4] https://stats.biopapyrus.jp/r/graph/expression.html
[5] https://stats.biopapyrus.jp/r/basic/package.html
[6] https://cran.r-project.org/web/packages/shape/shape.pdf

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2