実行環境
配列を先頭からノードに割り付け(座標付け)
今回の「配列」は、Rのデータ型で言えばベクトルです。先頭の要素から順に、二分木の上→下(同じ段では左→右)のノードと見なし、プロットするために座標を付け、3列のデータフレーム(x、y、配列の中身)にして返す関数datTreeを作りました。
プロット
上の結果のデータフレームを単純にプロットすると ↓ こんな感じ。
plot(axes=F, x=dat$x, y=dat$y, type='n')
for (i in 2:nrow(dat)) lines(dat[c(i, floor(i / 2)),])
text(dat, label=dat$val, col='red')
ここまでは簡単ですが、ノードを丸数字にする、余白を少なくする、出力サイズを変えても同様のプロット結果にする、などの整形がRでは大変。自分の未熟さもあって ↓ こんな長いコードになりました。。。
この結果が冒頭の画像で、元はSVGです。» binary_tree.svg(40kB)
上下を逆にプロット(見てると不安になる)
最初に作ったdatTree関数には上下を逆にするオプション(第2引数)があり、実際の木と同様に上へ向かって枝分かれするプロットに使えます。
vec = floor(runif(31) * 100)
vec = sort(unique(vec))
dat = datTree(vec, 'rev')
print(dat)
plotTree(dat)
でも実際プロットすると、何だか不安になります。自分だけ?» binary_tree_rev.svg(37.5kB)
igraphパッケージでも出来そう
今回は使わなかったけど、igraphパッケージでベクトルをグラフにすれば同様にプロットできるかも。
本来やりたいこと
Rとは余り関係なく、PostgreSQLの集約関数の状態遷移で、配列をヒープソートして四分位数とかパーセンタイルを出せないかな~と。PostgreSQL 9.4からパーセンタイル関数が追加されましたが、以前のバージョンもまだ少し使っているので。
パーセンタイルを出すには何らかの形で全レコードをストックする必要があり、状態遷移に配列を使い、適当な所でソートすると。その過程を可視化したいので、今日はRで書いてみました。座標付けまでは簡単だけど、ある程度きちんとプロットするのが大変。次はSVG + JavaScriptでやってみます。