note63

事情

gnuplotで値域の小さい離散値のヒートマップを書く

こういうやつを書きます

f:id:saku_na63:20151223104813p:plain

まず単一のヒートマップを書きましょう.

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

こんなやつが書けるはずです.

f:id:saku_na63:20151223102349p:plain

x軸のラベルが文字化けしているので直します

set terminal aqua font "HiraKakuPro-W3, 11"

ヒラギノが使えるかどうかは各自の環境によります. gnuplotで扱えるフォントの環境設定は以下を参考にしました.

gnuplotのインストールと設定 | monkeying11

f:id:saku_na63:20151223102356p:plain

配色がキモいのと,0,1,2,3の4つの値しかないのにカラーバーが連続していて無駄なので直します.

set palette maxcolors 4
set palette defined (0 '#ffffff', 1 '#bbbbbb', 2 '#999999', 3 '#666666')

f:id:saku_na63:20151223102415p:plain

目盛の値を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) # 目盛の値を書き換える

良さ気

f:id:saku_na63:20151223102633p:plain

これを並べるには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

f:id:saku_na63:20151223103406p:plain

わかりやすいように丸で囲ってるんですが,なぜかplotコマンドの引数が出てきちゃってるので消します.

unset key

なぜkeyとして引数が出るのかは謎,非常にわかりずらい.

f:id:saku_na63:20151223103646p:plain

左のグラフのカラーバーと,右のグラフの縦軸のラベルは無駄なので消します.

##### draw left heatmap
〜中略〜
unset colorbox
〜中略〜
###### draw right heatmap
〜中略〜
set colorbox
unset ytics
〜中略〜

左側のグラフを書くときに設定した内容が右側のグラフを書くときにも引き継がれてしまうので,右側のグラフを書くときにset colorboxで改めてカラーボックスを表示するように設定します. こうなる

f:id:saku_na63:20151223104109p:plain

わかりづらいんですけど,左側のグラフの横幅が大きくなっています. 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
〜中略〜

f:id:saku_na63:20151223104351p:plain

カラーボックスが細すぎるのでさらにいじる

set colorbox user size .03,.922 origin .65,.056
set size 0.18,1 # カラーボックスをいじると,サイズが変わってしまうのでごちゃごちゃする

f:id:saku_na63:20151223104813p:plain

最終的なコードの全体

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

おしまい