[matplotlib] 17. 疑似カラーマップを等高線風に表示

matplotlib

pcolormeshのカラーマップにレベルを設定して等高線風に表示

コード

解説

モジュールのインポート

データの生成

xとyはnp.meshgridによりデータを生成した。x,yはそれぞれslice()でdx, dy刻みのデータを生成しているので、dx,dyを小さくすることで解像度を上げることができる。z は関数 f(x, y)で生成した。
x,yの値は境界の値で、zはその境界内部のデータになるため、zのデータ数を1つ削減する必要がある。

カラーマップの設定

レベルの設定

MaxNLocator(nbins=15).tick_values(z.min(), z.max())でz.min()からz.max()を15個にわけたときの目盛の配列を返す。

カラーマップの種類と正規化

plt.get_cmap(‘PuOr’)で紫からオレンジに変化するカラーマップが得られる。

BoundaryNorm(levels, ncolors=cmap.N, clip=True)で、cmapの色の数(cmap.N(=256))をlevelの配列に従って分割したカラーマップが作成される。

図の生成

上の図(pcolormesh)

pcolormeshでx, y, zを指定し、設定したカラーマップ(cmap)と正規化の設定(norm)を適用することで、等高線風の疑似カラーマップが得られる。
fig.colorbar(im, ax=ax0)でカラーバーの表示が可能。

下の図(contourf)

等高線プロットはx,y,zが同じサイズである必要があるので、x,yのデータを一つ削減し、+dy/2, +dx/2することで中点へと移動している。

zがランダムデータの場合

zがランダムなデータの場合、pcolormeshとcontourfでは、見た目が大きく異なる。離散的なデータに対して、安易にcontourfを使うと誤解が生じる可能性があると考えられる。

参考

https://matplotlib.org/api/_as_gen/matplotlib.colors.BoundaryNorm.html
https://matplotlib.org/api/ticker_api.html
https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.pcolormesh.html
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.contourf.html

コメント