yukke::note

technical note

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してあげることで、引数として与えたカラム名をよしなにやってくれる。コードに起こすと以下のようになる。 f:id:soh3914:20150310174424p:plain

 こんな感じで、同じデータフレームで、カラム名が異なる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というか、ただのベストプラクティスとなってしまった。