55
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

matplotlibでカラーバーの範囲を思い通りにする

Last updated at Posted at 2019-05-30

この記事を読むとできるようになること
matplotlibで,データ値の範囲によらず,カラーバーの表示範囲を決められる

  • 環境
    • macOS mojave 10.14.4
    • Python 3.7.3

2次元カラーマップを書いていて,カラーバーの範囲が思うように出なくて困りました.
こんな図が欲しいのに,

fig1.png

描画するデータ値に引きづられて,カラーバーがこんなふうになってしまう!

fig2.png

表示されるカラーバーの範囲が,描画するデータ値の範囲に合わせて自動的に変わってしまいました.
これだと,複数の図を作るときにカラーバーが全部違ってしまうので美しくないですね.

表示するカラーバーの範囲を[-4:4]にしたいとします.
なにも考えずに2次元カラーマップを描くとこうなります.

colormap1
#!/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)

fig2.png

[-4:4]からはみ出すデータの範囲までカラーバーが負の方向に伸びている&存在しないデータ範囲のカラーバーは表示されなくなっています.

解決するには Normalize を使うと良いようです.

colormap2
#!/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)

fig1.png

これでカラーバーの範囲が思い通りになりました.
pp.set_clim(min, max)
では,カラースケールのグラデーションの端点を指定するだけで,
実際に表示されるカラーバーの範囲を決めているのではないみたいです.

カラーバーを対数スケールにするには,LogNorm を使います.

colormap3
#!/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)

fig3.png

この場合,グラデーションが対数目盛で描かれます.
(グラデーションの中央が,5e2ではなく1e2になるということ.この方が見やすいです)

55
50
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
55
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?