gnuplotで値域の小さい離散値のヒートマップを書く
こういうやつを書きます
まず単一のヒートマップを書きましょう.
set datafile separator "\t" plot 'mat1.tsv' matrix rowheaders columnheaders using 1:2:3 with image
mat1.tsv
の中身はこんな感じ
あ い う a 1 2 3 b 2 1 3 c 0 1 0
こんなやつが書けるはずです.
x軸のラベルが文字化けしているので直します
set terminal aqua font "HiraKakuPro-W3, 11"
ヒラギノが使えるかどうかは各自の環境によります. gnuplotで扱えるフォントの環境設定は以下を参考にしました.
gnuplotのインストールと設定 | monkeying11
配色がキモいのと,0,1,2,3の4つの値しかないのにカラーバーが連続していて無駄なので直します.
set palette maxcolors 4 set palette defined (0 '#ffffff', 1 '#bbbbbb', 2 '#999999', 3 '#666666')
目盛の値を0,1,2,3にするのと,目盛の位置を各色の中央に持っていきます
set cbtics -0.325, 0.75 # -0.325の位置(画面には描画されない)から0.75間隔で目盛を置く set cbtics scale 0 # 目盛のちょんちょんを消す set cbtics ('0' 0.425, '1' 1.175, '2' 1.925, '3' 2.675) #J, '4' 3.6) # 目盛の値を書き換える
良さ気
これを並べるにはmultiplot
を使います.
普通にmultiplotするとこんな感じになります.(違う値のグラフを並べていることに注意)
set terminal aqua font "HiraKakuPro-W3, 11" set multiplot layout 1,2 set datafile separator "\t" ##### draw left heatmap set palette maxcolors 4 set palette defined (0 '#ffffff', 1 '#bbbbbb', 2 '#999999', 3 '#666666') set cbtics -0.325, 0.75 set cbtics scale 0 set cbtics ('0' 0.425, '1' 1.175, '2' 1.925, '3' 2.675) #J, '4' 3.6) plot 'mat1.tsv' matrix rowheaders columnheaders using 1:2:3 with image ###### draw right heatmap set palette maxcolors 5 set palette defined (0 '#ffffff', 1 '#bbbbbb', 2 '#999999', 3 '#666666', 4 '#000000') set cbtics -0.4, 0.8 set cbtics ('0' 0.4, '1' 1.2, '2' 2.0, '3' 2.8, '4' 3.6) plot 'mat2.tsv' matrix rowheaders columnheaders using 1:2:3 with image
わかりやすいように丸で囲ってるんですが,なぜかplotコマンドの引数が出てきちゃってるので消します.
unset key
なぜkeyとして引数が出るのかは謎,非常にわかりずらい.
gnuplotで実行したコマンドのテキストがなぜかcanvas内に描画されてて,原因調べても出てこなくて半泣きになってたら,実はそれがkey扱いで表示されているということに気づいて発狂してる
— 優秀な同期 (@sakuna63) 2015, 12月 22
左のグラフのカラーバーと,右のグラフの縦軸のラベルは無駄なので消します.
##### draw left heatmap 〜中略〜 unset colorbox 〜中略〜 ###### draw right heatmap 〜中略〜 set colorbox unset ytics 〜中略〜
左側のグラフを書くときに設定した内容が右側のグラフを書くときにも引き継がれてしまうので,右側のグラフを書くときにset colorbox
で改めてカラーボックスを表示するように設定します.
こうなる
わかりづらいんですけど,左側のグラフの横幅が大きくなっています. gnuplotは横軸いっぱいに描画しようとするので,カラーボックスを消したぶん広がっちゃってるわけですね. これをゴリゴリいじります.
##### draw left heatmap 〜中略〜 set size 0.20,1 set origin 0.28,0 〜中略〜 ###### draw right heatmap 〜中略〜 set size 0.24,1 set origin 0.47,0 〜中略〜
カラーボックスが細すぎるのでさらにいじる
set colorbox user size .03,.922 origin .65,.056 set size 0.18,1 # カラーボックスをいじると,サイズが変わってしまうのでごちゃごちゃする
最終的なコードの全体
set terminal aqua font "HiraKakuPro-W3, 11" set multiplot layout 1,2 unset key ##### draw left heatmap set palette maxcolors 4 set palette defined (0 '#ffffff', 1 '#bbbbbb', 2 '#999999', 3 '#666666') set cbtics -0.325, 0.75 set cbtics scale 0 set cbtics ('0' 0.425, '1' 1.175, '2' 1.925, '3' 2.675) #J, '4' 3.6) unset colorbox set size 0.20,1 set origin 0.28,0 set datafile separator "\t" plot 'mat1.tsv' matrix rowheaders columnheaders using 1:2:3 with image ##### draw right heatmap set palette maxcolors 5 set palette defined (0 '#ffffff', 1 '#bbbbbb', 2 '#999999', 3 '#666666', 4 '#000000') set cbtics -0.4, 0.8 set cbtics ('0' 0.4, '1' 1.2, '2' 2.0, '3' 2.8, '4' 3.6) set colorbox unset ytics set colorbox user size .03,.922 origin .65,.056 set size 0.18,1 set origin 0.47,0 plot 'mat2.tsv' matrix rowheaders columnheaders using 1:2:3 with image unset multiplot
おしまい