目的
これをこうしたい。
変更前 | 変更後 |
---|---|
どうやら、GR
をバックエンドにした際には、こういったColorbarの目盛りの扱いがうまく機能していないようです(今後直ることを祈りましょう)。。。
そこで、今回は無理やりそれっぽくする方法を紹介します。
データ
サンプルデータは次のようにしました。
X = range(-2, 2, length=100)
Y = range(-2, 2, length=100)
Z = [exp(-(x^2+2y^2)/√2) for y in Y, x in X].*10000000
意図的に、とても大きな値となるようにしています。
通常の場合
heatmapを作成しようと試みると、次のようなコードになるかと思います。
heatmap_plot = heatmap(
X,Y,Z,
c=:bwr,
size=(500, 400),
cbar_title="COLORBAR_LABEL",
)
しかし、こうすると次のようにColorbarの目盛りの桁数によっていまいちな挙動になります。
邪道な解決法
そこで、今回は別にColorbarを人工的にheatmapでプロットし、それらを@layout
で並べて再現します。
- まず、Colorbarのないheatmapを
heatmap_plot
として作成します。heatmap_plot = heatmap( X,Y,Z, colorbar=:none, c=:bwr, )
- 続いて、Colorbarをプロットする
cbar(data)
という関数を作成します。こちらはdata
すなわちZ軸の値をもつデータを入力することで、実質的なColorbarを返してくれます。cbar(data,step=100) = begin cbar_data = range(minimum(data),maximum(data),step) cbar_fig = heatmap( [1],cbar_data, cbar_data .* ones(step, 1), c=:bwr, legend=:none, xticks=:none, yticks=:none, formatter=:scientific, ) axes_fig = twinx(cbar_fig) plot!(axes_fig, [1],cbar_data, legend=:none, xticks=:none, ylabel="COLORBAR_LABEL", ) end
- 最後に、これらを
@layout
を用いて結合させます。plot( heatmap_plot, cbar(Z), layout=@layout([grid(1, 1) a{0.03w}]), size=(500, 400), )
最後に
邪道な方法ですが、自由度はかなり高いので、いろいろといじりやすいと思います。早くGR
でも:scientific
などが使えるようになるといいですね。