HOWTO · Matplotlib
Matplotlib で等高線図を作成する方法
NumPy グリッド、スカラー場、カラーバーを使って、Matplotlib で線の等高線図と塗りつぶした等高線図を作成します。
このページの内容
Matplotlib の contour() は二次元スカラー場の同じ値を結ぶ等高線を描き、contourf() は線の間の領域を塗りつぶします。どちらの場合も、NumPy で座標グリッドを作り、プロットする値を計算できます。カラーバーを使うと、色と値の対応を読み取れます。
Matplotlib の contour() メソッドで等高線図を作成する
等高線図は、二次元平面上のスカラー場を表します。x と y の配列はそれぞれ水平方向と垂直方向の座標を示し、z には各座標位置のスカラー値が入ります。各等高線は、z が同じ値になる点を結びます。Matplotlib は3つの配列の対応する要素を組み合わせて使います。x[i, j] と y[i, j] が点の位置を示し、z[i, j] がその点の値を与えます。そのため、座標グリッドと値の配列は、互換性のある二次元の形状である必要があります。
この例では、numpy.linspace() を使って各軸について -2 から 2 までの座標を500個作ります。np.meshgrid() はそれらの一次元座標から、形状のそろった二次元配列を作ります。さらに、z = np.sin(x) + np.cos(y) で各グリッド位置の値を計算します。座標グリッドの作り方については、np.meshgrid() メソッドを参照してください。
次の例では、グリッドを作成し、等高線を描き、カラーバーを追加して図を表示します。コードは読者が実行できる形で掲載していますが、この草稿には実行結果が添付されていません。
import matplotlib.pyplot as plot
import numpy as np
x_values = np.linspace(-2, 2, 500)
y_values = np.linspace(-2, 2, 500)
x, y = np.meshgrid(x_values, y_values)
z = np.sin(x) + np.cos(y)
plot.contour(x, y, z)
plot.colorbar()
plot.show()
contour() の最初の2つの引数は座標グリッドで、3つ目はスカラー場です。この関数には、等高線を描く位置を制御する levels など、追加のオプション引数も指定できます。省略した場合、Matplotlib はデータ範囲から等高線のレベルを選びます。plot.colorbar() は、プロットの色が表す値を読み取るための目盛りを追加します。等高線上の値を読み取ったり、異なる位置の値を比較したりするときに便利です。軸には引き続き x と y の座標が表示されます。
Matplotlib で contourf() メソッドを使う
塗りつぶし等高線図には contourf() を使います。このメソッドは等高線レベルの間を色で塗り分け、contour() は等高線を描きます。どちらのメソッドでも入力の役割は同じなので、最初の例で作ったグリッドとスカラー場を再利用できます。塗りつぶし図は値の大まかな範囲を比較しやすくし、カラーバーは色に数値の尺度を与えます。次の一通りそろった例では、levels=30 を指定してカラーバーを追加しています。読者が実行できる例として掲載していますが、この草稿には実行結果が添付されていません。
import matplotlib.pyplot as plot
import numpy as np
x_values = np.linspace(-2, 2, 500)
y_values = np.linspace(-2, 2, 500)
x, y = np.meshgrid(x_values, y_values)
z = np.sin(x) + np.cos(y)
filled = plot.contourf(x, y, z, levels=30, vmin=-1, vmax=0.5)
plot.colorbar(filled)
plot.show()
levels は等高線のレベルを指定し、それによってスカラー場が色付きの領域にどう分割されるかが決まります。一方、vmin と vmax は色の正規化範囲を設定します。これらは z の値を除外したり、等高線のレベルを選んだりするものではありません。範囲の下限より小さい値や上限より大きい値もプロットに表され、カラーマップの under 色または over 色に割り当てられます。既定のカラーマップでは、under 色と over 色は、個別に設定しない限りカラーマップ両端の色です。
この例では、z の値が -1 から 0.5 の色範囲を外れていても、塗りつぶし等高線図に引き続き表されます。等高線の区分を変えるには levels を使い、値を色尺度に対応付ける方法を変えるには vmin または vmax を使います。