はじめに

以下で試した話をもうちょと可視化についてやってみようと思ったらハマったので、とりあえず動くコードを残しておきたいという話。

まず、ここの話で必要になるライブラリをロード。

library(ggplot2)
library(dplyr)

シミュレーション用の関数作成

まず、二次元ブラウン運動のシミュレーションを実施する関数を作成する。戻り値はdata.frameになっていて、

という4つの列を持つ。

make_2d_df <- function(label){
  size <- 100
  x <- cumsum(rnorm(size))
  y <- cumsum(rnorm(size))
  data.frame(x=x, y=y, group=rep(label, size), width=1:size)
}

シミュレーションの実行

そして、シミュレーションを実行する。この書き方も

で書いていた内容。

df <- lapply(LETTERS[1:10], make_2d_df) %>% rbind_all

可視化する

そして、ここからが問題の可視化だ。 以下のコードは前に結果を確認していた、(結果として得たいという意味で)正しく動くもの。各シミュレーション結果ごとにgroupというIDを振っており、それにより色分けして表示するってことだ。

ggplot(df, aes(x=x, y=y)) + geom_path(aes(color=group)) + geom_point(aes(color=group), size=3)

geom_pointが各シミュレーションの点の描画に相当しているが、今回やりたい趣旨とは違うので、もう使わない。

ggplot() + geom_path(aes(x=x, y=y, color=group), data=df)

これで線だけになった。ここで、線の色を全部黒にしたいぞと思って以下のようにcolor引数を追加してみると、結果としてうまくいかない。図には、余計な線が入っているように見えて、これは多分、各シミュレーション結果のgroup分けの処理がうまくいっておらず、全部をひとつなぎに描画しているように思える。

ggplot() + geom_path(aes(x=x, y=y, color=group), color="black", data=df)

これをなんとかしようと、次に、aes関数内で指定しているcolorの代わりにgroupを指定してみると、色が黒のままだが、まだパス(各シミュレーション経路)としては区別されたまま描画される。つまり、上の図でいう余計な線が入らなくなるってことだ。

ggplot() + geom_path(aes(x=x, y=y, group=group), data=df)

更に、geom_pathで描画するラインをちょっとずつ太くする、具体的にはdfwidth項目を使って線幅を返るには以下のようにsize引数を追加する。

ggplot() + geom_path(aes(x=x, y=y, group=group, size=width), data=df) 

この線幅自体の上下限を制御するためには、scale_size関数を用いて

ggplot() + geom_path(aes(x=x, y=y, group=group, size=width), data=df) + scale_size(range=c(0.1, 1))

と書くといい。ちなみに

がデフォルトの模様。

この状態で全体の線色を変えるにはgeom_path関数のcolor引数をいじるとよい。

ggplot() + geom_path(aes(x=x, y=y, group=group, size=width), color="#EC008C", data=df) + scale_size(range=c(0.1, 1))

たぶん、ggplot2の基本コンセプトが理解出来てないんだろうなぁ・・・