等高線の描き方【matplotlib】

matplotlib

等高線の基本

matplotlib.pyplot.contour(X, Y, Z)

等高線はmatplotlibでよく使われる折れ線グラフ・散布図とは違い、3つのデータを使用します。
X, Y, Zが必要です。
グラフは2次元ですが、データの用意は3次元グラフの容量ですると良いのではないでしょうか。

このX, Yを用意するには1手間必要です。
numpy.meshgrid()を使用して格子状の座標を作り出す必要があります。
(ここではnumpy.meshgrid()の詳しい使い方は紹介しません🙇‍♂️)

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-2, 5, 0.01)
y = np.arange(-3, 2, 0.01)
X, Y = np.meshgrid(x, y)

Z = np.exp(-(X**2 + Y**2)) 

plt.contour(X, Y, Z)
plt.show()

等高線のアレンジ

等高線の本数

levels引数に整数値を与えるとその数値分だけ等高線を描画できます。
この時の等高線の高さはドキュメントによると良い感じのものが自動的に決定されるようです。

# 左
cn = plt.contour(X, Y, Z, levels=2)
plt.clabel(cn) # 高さがわかりやすいようにラベルをつける

# 右
cn = plt.contour(X, Y, Z, levels=4)
plt.clabel(cn) # 高さがわかりやすいようにラベルをつける

表示する等高線の高さを指定

levels引数にリスト形式で与えると、その高さの等高線を描画してくれます。

cn = plt.contour(X, Y, Z, levels=[0.3, 0.5, 0.7])
plt.clabel(cn) # 指定できていることがわかりやすいようにラベルをつける

カラーバーの表示

カラーバーはplt.colorbar()で追加することができます。plt.colorbar()の引数にはplt.contour()の返り値を与えましょう。

cn = plt.contour(X, Y, Z, linewidths=3)
plt.colorbar(cn)

色を変更

色の指定にはcolorsに単一の色を与えるか、リストで複数の色を与えます。

一つだけ色を与えれば全ての等高線の色が変更されます。
複数の色をリストで与えれば順番に繰り返して色が使用されます。

plt.contour(X, Y, Z, colors='skyblue') # 左
plt.contour(X, Y, Z, colors=['skyblue','green','red']) # 右

透明度

alphaに0~1の値を与えることで、透明度を調整できます。

0が透明で、1が非透明です。

plt.contour(X, Y, Z, alpha=0.5)

カラーマップ

cmapにカラーマップ名を与えるとカラーマップを変更できます。
デフォルトは'viridis'です。

plt.contour(X, Y, Z, cmap='magma')

カラーマップの種類については以下の記事をご覧ください。

線幅

線幅を調整するには linewidths を使用します。

数値もしくはリスト形式で与えます。
数値で与えれば全ての等高線の幅を一括で変更が可能ですし、
リストで与えれば繰り返し使用されます。

# 左
plt.contour(X, Y, Z, linewidths=4)

# 右
plt.contour(X, Y, Z, linewidths=[2, 4, 6])

線の種類

線種を変更するには linestyles を使用します。

単一の線種もしくは、リスト形式で複数の線種を与えます。
単一の線種を与えれば全ての等高線の線種を一括で変更が可能ですし、
リストで与えれば繰り返し使用されます。

plt.contour(X, Y, Z, linestyles='dotted') # 左
plt.contour(X, Y, Z, linestyles=['dotted', 'dashdot', 'solid']) # 右

使用可能な線種は以下の記事をご覧ください。

高さ(Zの値)のラベルを表示

各等高線の高さ(Zの値)がいくつかを表すラベルをつけることが可能です。

plt.contour()の返り値をplt.clabel()に与えることでラベルをつけることができます。
この際に様々な引数でラベルをカスタマイズすることができます。
使用可能な引数等は以下のドキュメントをご覧ください。

matplotlib.contour — Matplotlib 3.8.3 documentation
cn = plt.contour(X, Y, Z)
plt.clabel(cn,
    fontsize=15,
    inline=True,
    inline_spacing=10
)

等高線の塗りつぶし

等高線塗りつぶしの基本

等高線の塗りつぶしは plt.contour() ではなく plt.contourf() を使用します。

plt.contourf(X, Y, Z)

ハッチの追加

ハッチを追加するには hatches引数を使用します。

こちらも単体だけ与えることも可能ですが、リスト形式で複数与えることも可能です。
単体で与えれば一括で適用ができ、リスト形式で与えれば繰り返し適用されます。

ハッチの種類と指定方法は以下のドキュメントをご覧ください。

Hatch style reference — Matplotlib 3.8.3 documentation
plt.contourf(X, Y, Z, hatches='..', cmap='gist_yarg') # 左
plt.contourf(X, Y, Z, hatches=['..', '*', '/'], cmap='gist_yarg') # 右

コメント