TokyoR 69 LT
ggbodeパッケージを作る

niszet

2018/04/21

自己紹介

こんな人です

名前:niszet*
Rおじさん歴:2年目
趣味:R、楽器(お休み中)、ラズパイなど
self

普段は回路設計などしています

ggplot2で
bode線図を描きたい

bode線図とは

  • 周波数によって変化するゲインと位相を見るための図
  • 制御や電気電子回路の分野等で系の安定性を見るために使う。
    • ゲイン余裕とか位相余裕とか…

先行事例(あまりない)

  • そもそも需要がないのでは…(?)
    • niszetも以前やってたらしい(完全に忘れてた)
    • ただし前処理が大量に必要で図の見栄えもイマイチ…

ご参考

  • 抜粋

Rの型

Rのデータ型(mode)いろいろ

  • integer
  • numeric
  • logical
  • character
  • raw (以前紹介。バイナリ)
  • complex (今回出てきます)

complex型

  • 複素数型。複素数は電気回路とかでよく使うらしい
  • 数字のあとにiをつけると複素数型になる(jではダメ)
## [1] 0+2i
## [1] 1+1i
  • characterの次に強い型

complex型の弱点

  • ネットにも書籍にも情報がほとんどない…

  • ggplot2パッケージは直接complex型を扱えない
    • Re()Im()`で実部と虚部を取り出して対応
    • plot()complexを直接扱える
  • メモリをより多く使う

## 840 B
## 1.64 kB

ggbodeへの要求仕様

とにかく楽にプロットしたい

  • MUST: 基本は前処理も関数内に含める
  • WANT: カスタマイズできるようにしたい

成果

プロット用のデータ作成

  • 自作の1次のLPFの周波数特性を返す関数を使用。
##          x            y
## 1 3.000000 1-0.0000188i
## 2 3.366055 1-0.0000211i
## 3 3.776776 1-0.0000237i
## 4 4.237613 1-0.0000266i
## 5 4.754680 1-0.0000299i
## 6 5.334838 1-0.0000335i

えいっ

細かい話

グラフは2つ同時に表示したい

  • 以前は別々のdata.frameを準備してた(手間)
  • complex型を受け取ることで1つの列で2つのy軸を作成
  • gridExtraパッケージでゲインと位相を同時に表示

縦軸はdB(デシベル)や度数表記に

  • ggbode内部で変換する。

x軸の対数表示と目盛

  • scale_x_log10()を使う
    • breaksminor_breaks で主目盛と副目盛をそれぞれ作成
  • xlimを引数にとれるようにする。
    • c(6,4e3)のような値が与えられても副目盛線を調整する

目盛の見栄え調整

  • 目盛の表示が 1E9とか \(1^9\) では見づらい
    • sitoolsパッケージを使って 1G のように表示させる
  • 対数の補助の目盛が欲しい
    • 下記を追加。
  • 対数scale以外に使うとメモリが爆発するので注意
  • この正体は geom_logticks 、つまり layer です。

上下限を設定しなくても
良い感じにplotしたい

  • ggplot2 パッケージの print.ggplot() 内の ggplot_build() でプロットする範囲を求めている
  • ggbode もこの結果を使っている。
    • 本当は print.ggbode() を実装したい。課題。

まとめ

まとめ

  • 出来たこと
    • bode線図をggplot2パッケージを使って描いた
    • complex型を使った(☜ 重要)
    • minor_breaksなどの処理を取り込んだ
    • パッケージ化の道は遠い…
  • 今後の課題
    • パッケージに必要な情報の整備
      • DESCRIPTIONとか色々
    • facetの対応が難しい…
    • 色々な設定に対応する

Enjoy!!

self