この記事を読むとできるようになること
matplotlibで,データ値の範囲によらず,カラーバーの表示範囲を決められる
- 環境
- macOS mojave 10.14.4
- Python 3.7.3
2次元カラーマップを書いていて,カラーバーの範囲が思うように出なくて困りました.
こんな図が欲しいのに,
描画するデータ値に引きづられて,カラーバーがこんなふうになってしまう!
表示されるカラーバーの範囲が,描画するデータ値の範囲に合わせて自動的に変わってしまいました.
これだと,複数の図を作るときにカラーバーが全部違ってしまうので美しくないですね.
表示するカラーバーの範囲を[-4:4]にしたいとします.
なにも考えずに2次元カラーマップを描くとこうなります.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
#…(省略)…
mappable0 = ax1.pcolormesh(X,Y,z, cmap='coolwarm')
pp = fig.colorbar(mappable0, ax=ax1, orientation="vertical")
pp.set_clim(-4,4)
pp.set_label(“color bar“, fontname="Arial", fontsize=10)
[-4:4]からはみ出すデータの範囲までカラーバーが負の方向に伸びている&存在しないデータ範囲のカラーバーは表示されなくなっています.
解決するには Normalize
を使うと良いようです.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize # Normalizeをimport
fig = plt.figure()
ax1 = fig.add_subplot(111)
#…(省略)…
mappable0 = ax1.pcolormesh(X,Y,z, cmap='coolwarm', norm=Normalize(vmin=-4, vmax=4)) # ここがポイント!
pp = fig.colorbar(mappable0, ax=ax1, orientation="vertical")
pp.set_clim(-4,4)
pp.set_label(“color bar“, fontname="Arial", fontsize=10)
これでカラーバーの範囲が思い通りになりました.
pp.set_clim(min, max)
では,カラースケールのグラデーションの端点を指定するだけで,
実際に表示されるカラーバーの範囲を決めているのではないみたいです.
カラーバーを対数スケールにするには,LogNorm
を使います.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm # LogNormをimport
fig = plt.figure()
ax1 = fig.add_subplot(111)
#…(省略)…
mappable0 = ax1.pcolormesh(X,Y,z, cmap='coolwarm', norm=LogNorm(vmin=1e1, vmax=1e3)) # ここがポイント!
pp = fig.colorbar(mappable0, ax=ax1, orientation="vertical")
pp.set_clim(1e1,1e3)
pp.set_label(“color bar“, fontname="Arial", fontsize=10)
この場合,グラデーションが対数目盛で描かれます.
(グラデーションの中央が,5e2ではなく1e2になるということ.この方が見やすいです)