LoginSignup
7
5

More than 1 year has passed since last update.

【matplotlib】カラーバの目盛数などを色々と調整したい

Last updated at Posted at 2023-03-26

はじめに

matplotlibでカラーバの表示される目盛を少し減らしたい場面があり、その際に色々と調べたので備忘録も兼ねて本記事を書きました。
本記事は、カラーバの目盛間隔を適当な数に指定したい、任意の等間隔にしたい、とにかくいじりたい方向けにまとめたつもりですので、もし参考になれば幸いです。

image.png

実装

Google Colabで作成した本記事のコードは、こちらにあります。

各種インポート

各種インポート
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np

実行時の各種バージョン

Name Version
numpy 1.22.4
matplotlib 3.5.3

目盛数の指定

いい感じに目盛数を決めて表示するには、MaxNLocator()が便利です。とりあえず、目盛数の簡易的に調整したいだけの場合は、この関数を使えば事足りると思います。
実装例では、3個の目盛を表示をいい感じに表示するようにしています。この関数のnbinsに表示個数を指定します。
※この関数はnbinsよりも少なくor多く表示されるケースがあるので、詳しくは補足のMaxNLocator()の注意事項をご覧ください。

実装例
data = np.arange(100).reshape(10, 10)
fig, ax = plt.subplots()
heatmap = ax.imshow(data)
cbar = plt.colorbar(heatmap, ticks=mticker.MaxNLocator(nbins=3))
plt.show()

image.png

等間隔な目盛の指定

等間隔に目盛を表示するには、MultipleLocator()が便利です。
実装例では、22置きに目盛を表示するようにしています。この関数のbaseに表示間隔を指定します。

実装例
data = np.arange(100).reshape(10, 10)
fig, ax = plt.subplots()
heatmap = ax.imshow(data)
cbar = plt.colorbar(heatmap, ticks=mticker.MultipleLocator(base=22))
plt.show()

image.png

基準値からの等間隔な目盛の指定

等間隔に目盛を表示するには、IndexLocator()が便利です。
実装例では、値5を基準にして、25置きに目盛を表示するようにしています。この関数のbase, ofsetはそれぞれ、間隔と基準値を指定する引数です。

実装例
data = np.arange(100).reshape(10, 10)
fig, ax = plt.subplots()
heatmap = ax.imshow(data)
cbar = plt.colorbar(heatmap, ticks=mticker.IndexLocator(base=25, offset=5))
plt.show()

image.png

任意の目盛に指定

任意の目盛を表示するには、以下のように書きます。

実装例
data = np.arange(100).reshape(10, 10)
fig, ax = plt.subplots()
heatmap = ax.imshow(data)
cbar = plt.colorbar(heatmap, ticks=[33, 59, 72])
plt.show()

image.png

等分割な目盛に指定

LinearLocator()を使うと、カラーバの最小値と最大値の間を等分割に目盛を指定できます。引数のnumticksは分割数を表し、実装例では5分割しています。

実装例
data = np.arange(100).reshape(10, 10)
fig, ax = plt.subplots()
heatmap = ax.imshow(data)
cbar = plt.colorbar(heatmap, ticks=mticker.LinearLocator(numticks=5))
plt.show()

image.png

※MaxNLocator()とLinearLocator()の棲み分け

対数スケールで目盛を指定

LogLocator()を使うと、カラーバの最小値と最大値の間を対数スケールで目盛を指定できます。引数のbaseは基底を表し、実装例では基底は2にしているので、2の累乗が表示されています。
※この関数は全ての目盛が表示されない場合があるので、詳しくは補足のLogLocator()の注意事項をご覧ください。

実装例
data = np.arange(1, 101).reshape(10, 10)
fig, ax = plt.subplots()
heatmap = ax.imshow(data)
cbar = plt.colorbar(heatmap, ticks=mticker.LogLocator(base=2))
plt.show()

image.png

目盛の非表示

目盛を表示したくない場合は、NullLocator()を使います。

実装例
data = np.arange(100).reshape(10, 10)
fig, ax = plt.subplots()
heatmap = ax.imshow(data)
cbar = plt.colorbar(heatmap, ticks=mticker.NullLocator())
plt.show()

image.png

補足

MaxNLocator()の注意事項

ある特定の条件を満たす場合は目盛は0を基準として定義されます(区切りのいい数字が表示されるようにされるための仕様だと思います)。以下のような2つ例では、nbins=3と指定しても2つしか目盛が表示されないので注意しましょう。また、0基準でないケースでは、nbins=3と指定しても4つ表示されるといった場合もあるので、あくまで表示されるカラーバを確認しながら調整しましょう。

特定の条件とは

特定の条件とは、matplotlibのソースコードを追うと理解できます。matplotlib本家のMaxNLocator()の中身を見ると、基準を決めている箇所があり、そこでは、ロカールで使われたscale_range()と呼ばれる関数が呼び出されます。
この関数の中身では0を基準とする条件は以下のようにしています。カラーバの最大値(Max), 最小値(Min)が

\frac{abs(Max+Min)}{abs(Max-Min)} < 200

を満たす場合は、0を基準としています。この式の解釈は、カラーバの最大値と最小値が非常に大きくかつ近い値のときにこの条件を満たさない場合があり、その場合は基準が0ではない別で定義されたものが使われます。それ以外は基準は0となります。詳しくはmatplotlibのソースコードmatplotlib/lib/matplotlib/ticker.pyをご覧ください。

-60~39のデータでも0基準の目盛
data = np.arange(-60, 40).reshape(10, 10)
fig, ax = plt.subplots()
heatmap = ax.imshow(data)
cbar = plt.colorbar(heatmap, ticks=mticker.MaxNLocator(nbins=3))
plt.show()

nbins=3ですが、2個しか表示されていません。

image.png

100~109のデータでは0基準の目盛
data = np.arange(100, 110).reshape(5, 2)
fig, ax = plt.subplots()
heatmap = ax.imshow(data)
cbar = plt.colorbar(heatmap, ticks=mticker.MaxNLocator(nbins=3))
plt.show()

目盛が0基準であることがわかります。0から等間隔に引かれた目盛のため、スタートが102(3で割り切れる数)となっています。このケースを10倍にして同じように表示してみたのが次のカラーバです。
image.png

1000~1009のデータでは0基準ではない目盛
data = np.arange(1000, 1010).reshape(5, 2)
fig, ax = plt.subplots()
heatmap = ax.imshow(data)
cbar = plt.colorbar(heatmap, ticks=mticker.MaxNLocator(nbins=3))
plt.show()

nbins=3ですが、4個も表示されています。上記で触れた特定の条件より、0基準でないです。0基準かどうかは、0から等間隔に計算された目盛を使っているといるかどうかで判断できます。以下のカラーバを見ると、3の倍数の等間隔な目盛ですが、1000は3の倍数ではないのでこの目盛は0基準では作られていないことが分かります。そして、このように0基準で作られないカラーバは、しばしばnbinsよりも大きくなることもあります。
image.png

LogLocator()の注意事項

この関数は負の値は使用できず、また0~1の値を含む場合は、全ての目盛を表示しない場合があります。以下では、例を2つ紹介し、その挙動を確認します。

最小値0を含む
data = np.arange(0, 100).reshape(10, 10)  # 0~99の範囲のデータ
fig, ax = plt.subplots()
heatmap = ax.imshow(data)
cbar = plt.colorbar(heatmap, ticks=mticker.LogLocator(base=2))
plt.show()

1, 2, 4, 8, 16が表示されていない。
image.png

最小値0.2を含む
data = np.arange(0, 100, dtype=np.float64).reshape(10, 10)
data += 0.2  # 0.2~99.2の範囲のデータ
fig, ax = plt.subplots()
heatmap = ax.imshow(data)
cbar = plt.colorbar(heatmap, ticks=mticker.LogLocator(base=2))
plt.show()

1, 4, 16, 64が表示されていない。
image.png

まとめ

matplotlibでとにかく色々とカラーバをいじりたい方向けの記事を書いてみました。筆者は全てのカラーバで使えそうな関数を網羅できたていないので、詳しい情報はmatplotlibの本家のページをご覧ください。上記の関数を理解し使いこなしていきましょう。

参考資料

7
5
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
7
5