ggplot2のプロットをできるだけ共通化したい
小さな問題
ggplot2の場合であるがplot系の関数の使われ方として、おなじデータにたいして、異なるスケールで、ラベルを変えて、色を変えて、、と幾つかのバージョンのplotを作りたいことは多々ある。こういうのは、g.1 <- ggplot(...)
、g.2 <- ggplot(...)
などと、データやカラム名にべったりなコードを書いてしまって、後からも非常に読みにくい。とてもつらい。できるところは共通化して、ラベル名やカラム名は引数として渡しておけばすっきりするように思える。
ただ、文字列としてカラム名を渡しても、エラー: geom_point requires the following missing aesthetics: x, y
とかでエラーになる。これまでめんどくさくて調べずに放置していたが、ちゃんと方法があった。
ggplot2::aes_string()
を使おう
通常は、aes(x=y, y=y)
であるところを、ggplot2::aes_string
でwrapしてあげることで、引数として与えたカラム名をよしなにやってくれる。コードに起こすと以下のようになる。
こんな感じで、同じデータフレームで、カラム名が異なるplotを一つの関数としてwrapすることで、3つのplotを一つの関数へ共通化することができた。あと、可変長引数となっているので、ggplot::title
などもどんどん渡していく。まあこれくらいのことなら、pair
とかいうカラムにplotの種類を列挙して、ggplot::facet_wrap(~pair)
一発でもよい気がするが、、、。
それから、引数として受け取ったデータフレームdfのxカラム加工する場合、df$x <- log10(df$x+1)
とかだと、'closure' 型のオブジェクトは部分代入可能ではありません
とか怒られるので、df[, x] <- log10(df[, x]+1)
と書くこと。ハマった。R力高めたい。なんだかtipsというか、ただのベストプラクティスとなってしまった。