Matplotlibの等高線図#

※記事内に商品プロモーションを含むことがあります。

公開日

Matplotlibで等高線図を出力するには、ax.contour(線のみ)またはax.contourf(塗り潰し)を使用します。

どちらの手法でも、最初の引数に2次元配列を与えます。このページでは前者のax.contourを例としてオプションの指定方法を書いていますが、ax.contourfも同様に指定できます。

import numpy as np
import matplotlib.pyplot as plt

C = np.arange(50).reshape(5, 10)

fig, ax = plt.subplots()
ax.contour(C) # 線のみ
plt.show()

fig, ax = plt.subplots()
ax.contourf(C) # 塗り潰し
plt.show()
../_images/f72a0de9c0591911f56945a60039da8e425eb887f42d4fafcfd4c92451be8c9e.png ../_images/62883594fa4f60e4f1948612eb9f8b455d818d405a3f9e90b79523d94a84bfea.png

上の等高線図では、値が小さい箇所は紫色、値が大きい箇所は緑色・黄色になります。 ここで、Cは以下のような5行10列の2次元配列です。等高線図の横軸は0から9, 縦軸は0から4の範囲で出力されています。

C
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44, 45, 46, 47, 48, 49]])

目盛りの指定#

等高線図の横幅と縦軸の目盛りを指定する場合、以下のようにax.pcolorの1, 2番目の引数に配列として与えます。

X = np.arange(5,15) # 横幅の目盛り
Y = np.arange(5,10) # 縦幅の目盛り

fig, ax = plt.subplots()
ax.contour(X, Y, C)
plt.show()
../_images/5bd9250944e3095ed08544824cdfe8a7747d024a92162c662f0baf9294159da6.png

カラーマップの指定#

cmapオプションでカラーマップを指定します。

fig, ax = plt.subplots()
ax.contour(C, cmap="Reds")
plt.show()
../_images/0796a85883688bdd8a83665c18c827f4edb66b27154b8fbb4e8947cdaaa624f2.png

指定可能なカラーマップについては、以下のページも参照下さい。

Matplotlibのカラーマップ

カラーバーを表示する場合、plt.colorbarを使用します。ax.pcolorの戻り値はPolyCollectionというクラスのオブジェクトです。これをplt.colorbarの最初の引数とします。また、axオプションにカラーバーを表示するグラフ(ここではax)を指定します。

fig, ax = plt.subplots()
mappable = ax.contour(C)
plt.colorbar(mappable, ax=ax)
plt.show()
../_images/f6743e1ec5d606e9c08a7395bb2904a021aaf41fdd953aa5c7fe53bef15896cb.png

表示するカラーマップの範囲を固定したい場合、最小値と最大値をそれぞれvmin, vmaxで指定します。

カラーバーにラベルを付ける場合、plt.colorbarの戻り値を取得(以下ではcbarとしています)し、この戻り値のset_labelメソッドを使用します。

fig, ax = plt.subplots()
mappable = ax.contour(C, vmin=10, vmax=40)
cbar = plt.colorbar(mappable, ax=ax)
cbar.set_label('Value')
plt.show()
../_images/195eca8ea249ff852374461b301b9256d1b2bbc9cd194bec6d028114bf43d2d4.png

等高線の間隔#

等高線の間隔を指定する場合、表示する等高線の値を配列として、levelsオプションに与えます。また、levelsオプションにint型の数値を与えた場合、等高線の本数になります(間隔は自動的に決まります)。

fig, ax = plt.subplots()
mappable = ax.contour(C, levels=[0, 10, 20, 30, 40, 50])
plt.colorbar(mappable, ax=ax)
plt.show()
../_images/24ca54b5a68b029f493ab5368d8e4e93003b5f90f6e8bf7271a4d9e0c7a86df4.png
fig, ax = plt.subplots()
mappable = ax.contour(C, levels=6)
plt.colorbar(mappable, ax=ax)
plt.show()
../_images/f6743e1ec5d606e9c08a7395bb2904a021aaf41fdd953aa5c7fe53bef15896cb.png

等高線のラベル#

等高線の値をラベルとして表示するには、ax.contour()の戻り値であるContourSetクラスのオブジェクトを取得し、ax.clabel()に渡します。

fig, ax = plt.subplots()
cs = ax.contour(C) # cs: ContourSetクラスのオブジェクト
ax.clabel(cs)
plt.show()
../_images/29937088656341b788fad466bf97667ac315df34fd4794538e6823c70fa1888a.png

ax.clabelの主なオプションを以下の表に示します。

オプション

説明

fontsize

フォントのサイズ

colors

ラベルの色

inline

Trueの場合はラベルと重なる等高線が消える(デフォルト:True

inline_spacing

inline=Trueのときに、削除する等高線のピクセル数を指定(デフォルトは5

fmt

ラベルのフォーマットを指定(例:'%1.3f'

ラベルのフォントサイズはfontsize, 色はcolorsオプションでそれぞれ指定できます。

fig, ax = plt.subplots()
cs = ax.contour(C)
ax.clabel(cs, fontsize=15, colors="black")
plt.show()
../_images/f727260d98ac0c4ae0de241b0d9008ad274d56b3c615ea6cdfa7e6e07e6791b7.png

また、inline=False(文字列を等高線を重ねる)、 fmt='%.2f'(小数点以下2桁)とした例を以下に示します。

fig, ax = plt.subplots()
cs = ax.contour(C) # cs: ContourSetクラスのオブジェクト
ax.clabel(cs, inline=False, fmt='%.2f')
plt.show()
../_images/0ced7326341c04f4cfcf3ab16d0a3de66a14e519355eaac8bab39d0f8819229c.png

等高線の色の上下限#

等高線の色の上限値と下限値は、それぞれvmax, vminで指定します。vmax以上の値とvmin以下の値の色は、カラーマップの両端の色と同じになります。以下は0から49までの値をとる配列Cに対して、vmax=40, vmin=10とした例です。10から40までの値の変化が分かりやすくなります。

fig, ax = plt.subplots()
mappable = ax.contour(C, vmax=40, vmin=10, levels=[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50])
plt.colorbar(mappable, ax=ax)
plt.show()
../_images/ecbeb4fc751d124ebdc9b974de96f5244854e46cd0f3b010564a00f7060552a2.png

また、以下の例はvmax=70, vmin=-20とした例です。こちらでは、値の変化が分かりづらくなります(値の変化が小さいことを示せます)。

fig, ax = plt.subplots()
mappable = ax.contour(C, vmax=70, vmin=-20, levels=[-20, -10, 0, 10, 20, 30, 40, 50, 60, 70])
plt.colorbar(mappable, ax=ax)
plt.show()
../_images/c8575ec73309023d71688b7a8501a7b224f62f5951fac20e61da513c06aa5b9c.png

線の太さの変更#

linewidthsオプションで線の太さを指定できます。

fig, ax = plt.subplots()
ax.contour(C, linewidths=8)
plt.show()
../_images/6ae9d6655a5f245e89b26cc0cb6eb89fae105a3cc46f3baf4e27dca7b8a28197.png

透明度の指定#

等高線図の塗り潰し(ax.contourf)で透明度を指定するには、alphaオプションを使用します。0から1の範囲の値を取り、値が小さいほど透明になります(デフォルトは1)。

fig, ax = plt.subplots()
ax.contourf(C, alpha=1) # デフォルト
plt.show()

fig, ax = plt.subplots()
ax.contourf(C, alpha=0.5)
plt.show()
../_images/62883594fa4f60e4f1948612eb9f8b455d818d405a3f9e90b79523d94a84bfea.png ../_images/31e5bf37e9db0b1e95f0bdee4fab4a016cf0ff1a640093a14b070700e0db5344.png