Pynote

Python、機械学習、画像処理について

matplotlib - clabel で等高線にラベルを付ける方法について

関連

matplotlib.pyplot.clabel(CS, *args, **kwargs)

基本的な使い方

データを作成する。

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D


def f(x, y):
    return x**2 + y**2 + x * y


X, Y = np.mgrid[-10:11, -10:11]
Z = f(X, Y)

等高線及び等高線のラベルを描画する。

等高線を contour 関数で作成すると、返り値として contour.QuadContourSet オブジェクトを返す。
これを clabel の引数に渡すことで等高線のラベルを作成できる。

fmt でラベルのフォーマットを指定できる。
fontsize でラベルのフォントサイズを指定できる。

fig, ax = plt.subplots(figsize=(7, 7))
cs = ax.contour(X, Y, Z)
print(type(cs))  # <class 'matplotlib.contour.QuadContourSet'>
ax.clabel(cs, fontsize=10, fmt='%.2f')

plt.show()


ラベルを表示する等高線を選択する。

デフォルトではすべての等高線にラベルが表示されるが、第2引数にラベルを表示する等高線のリストを渡すことで、その等高線にだけラベルが表示される。
すべての等高線の値は contour の返り値 contour.QuadContourSet オブジェクトの levels 属性で確認できるので、その中からラベルを表示する等高線を選ぶ。

fig, ax = plt.subplots(figsize=(7, 7))
cs = ax.contour(X, Y, Z)
print(cs.levels)  # [  0.  40.  80. 120. 160. 200. 240. 280. 320.]

# 2つおきに表示する。
ax.clabel(cs, cs.levels[::2])

plt.show()


ラベルの色を指定する。

すべて同じ色にする場合

fig, ax = plt.subplots(figsize=(7, 7))
cs = ax.contour(X, Y, Z)
ax.clabel(cs, colors='black')

plt.show()

等高線ごとに指定する場合

# 各等高線の色をランダムに作成する。
np.random.seed(42)
colors = np.random.rand(len(cs.levels), 3)

fig, ax = plt.subplots(figsize=(7, 7))
cs = ax.contour(X, Y, Z)
ax.clabel(cs, colors=colors)

plt.show()


ラベルと等高線間の余白を設定する。

inline=True の場合、ラベルの周りは等高線を表示しない。
その場合、inline_spacing でその幅を指定できる。

fig, [ax1, ax2] = plt.subplots(1, 2, figsize=(10, 5))

cs = ax1.contour(X, Y, Z)
ax1.set_title('inline=True')
ax1.clabel(cs, inline=True, inline_spacing=5)

cs = ax2.contour(X, Y, Z)
ax2.set_title('inline=False')
ax2.clabel(cs, inline=False)

plt.show()