等高線グラフの作成について悩んでいませんか?データの密度やパターンを的確に表現するためには、正しい方法で等高線グラフを作成する必要があります
Matplotlibであれば,少ないコードで簡単に等高線グラフを表示させることができます
本記事では,Matplotlibで等高線グラフを表示する方法について,データから描画までを通して解説します
また,3次元に対応したグラフについても解説しています
等高線グラフのための3次元データの作成
等高線グラフはxとy座標に高さ方向のzを加えた3次元データになります
Matplotlibで用いる3次元データは工夫が必要になるため,本章で3次元データの処理方法を解説します
- x:-3から3までの区間を0.025刻みにした240要素を持つ配列
- y:-2から2までの区間を0.025刻みにした160要素を持つ配列
- X,Y,Z:等間隔に値が並んでいる160行240列の行列
下記のタブに3次元データのコードとフローチャートの解説をしています
import matplotlib.pyplot as plt
import numpy as np
# データ作成用の関数
def plt_data():
delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2
# 関数の呼び出し
X, Y, Z = plt_data()
# xの形状: 240
# Xの形状: (160, 240)
# yの形状: 160
# Yの形状: (160, 240)
# Zの形状: (160, 240)
最もシンプルなラベル付きの等高線グラフ (Axes.contour)
Matplotlibで等高線グラフを表示する際には,Axes.contour関数を使います
XとYは,numpy.meshgrid関数で処理した160行240列の座標行列,Zにはグリッドデータから作成した等高線の高さを表す160行240列の行列になります
- 引数
- 返値
- 公式ドキュメント
下記のタブにコードとフローチャートの解説をしています
import matplotlib.pyplot as plt
import numpy as np
# step1 3次元データの呼び出し
X, Y, Z = plt_data()
# step2 グラフフレームの作成
fig, ax = plt.subplots()
# step3 等高線グラフの描画
CS = ax.contour(X, Y, Z)
# step4 等高線グラフのラベル表示
ax.clabel(CS, inline=True)
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_title('Simple Contour')
plt.show()
色を塗りつぶしたカラーバー付きの等高線グラフ (Axes.contourf)
Matplotlibで等高線グラフの色を塗りつぶして表示する際には,Axes.contourf関数を使います
基本的な関数の使い方はAxes.contourと同じです
- 引数
- 返値
- 公式ドキュメント
下記のタブにコードとフローチャートの解説をしています
# step1 3次元データの呼び出し
X, Y, Z = plt_data()
# step2 グラフフレームの作成
fig, ax = plt.subplots()
# step3 塗りつぶし等高線グラフの描画
CS = ax.contourf(X, Y, Z)
# step4 カラーバーの表示
fig.colorbar(CS)
plt.show()
等高線の数や間隔をカスタマイズ (levels)
等高線の数や間隔をカスタマイズするには,levelsで数値を指定します
levelsをint型で指定した場合は,等高線の数がN+1の数以上でいい感じになるように自動で選ばれます
# step3 等高線グラフの描画
CS = ax.contour(X, Y, Z, levels=13)
plt.show()
等高線の色と透明度を指定 (colors, alpha)
等高線の色はcolors=文字列(配列も可),透明度はalpha=数値でカスタマイズします
colorsは文字列のみで指定も可能ですし,配列で各色を文字で指定することも可能です
等高線の色を文字列で指定する
Axes.contour関数の引数のcolorsに,redやblackなどの文字列を入力すると色が変化します
# step3 等高線グラフの描画
ax.contour(X, Y, Z, colors='red')
plt.show()
等高線の色を配列で指定する
Axes.contour関数の引数のcolorsに,redやblackなどの文字列がある配列を指定するとそれらの色に変化します
# step3 等高線グラフの描画
ax.contour(X, Y, Z, colors=['red', 'black'])
plt.show()
等高線の色をカラーコードで指定して透明度を変える
色はカラーコードやRGBで指定することも可能です
今回はカラーコードを指定しました
また,透明度を変更する場合は,alphaに0~1の数値を入力します
# step3 等高線グラフの描画
ax.contour(X, Y, Z, colors='#0097a7', alpha=0.5)
plt.show()
等高線をカラーマップから指定 (cmap)
カラーマップはデータ数値に合わせて色を変化させることができます
この関数はデータの最小値から最大値にかけてのRGBAの配列を生成します
- 引数
-
- name (文字列) : カラーマップの名前
- N (int) : RGBの量子化レベルの数
- 返値
-
- データがスカラー:RGBAの配列 (tuple)
- データが配列:RGBAの配列 (データ配列+4行)
- 公式ドキュメント
白黒で等高線グラフを表現する (Greys)
Axes.contour関数の引数のcmapに,Greysの文字列を入力すると白黒に変化します
# step3 等高線グラフの描画
CS = ax.contourf(X, Y, Z, cmap='Greys')
# step4 カラーバーの設定
fig.colorbar(CS, ax=ax)
plt.show()
赤と青の2色で等高線グラフを表現する(bwr)
Axes.contour関数の引数のcmapに,bwrの文字列を入力すると赤と青に変化します
# step3 等高線グラフの描画
CS = ax.contourf(X, Y, Z, cmap='bwr')
# step4 カラーバーの設定
fig.colorbar(CS, ax=ax)
plt.show()
論文用の等高線グラフ (countour, contourf)
contourとcontourfを組み合わせて,最も見た目が美しい論文用の等高線グラフを作り上げます
等高線を塗りつぶしつつ,等高線を黒色,カラーバーおよびラベルを表示させています
# step1 3次元データの呼び出し
X, Y, Z = plt_data()
# step2 グラフフレームの作成
fig, ax = plt.subplots()
# step3 等高線グラフの描画
CS = ax.contour(X, Y, Z, colors='black')
# step4 等高線グラフのラベル表示
ax.clabel(CS, inline=True)
# step5 等高線の塗りつぶし
CSf = ax.contourf(X, Y, Z)
# step6 カラーバーの設定
cbar = fig.colorbar(CSf)
cbar.ax.set_ylabel('Z Label')
cbar.add_lines(CS)
plt.show()
3次元の等高線グラフ (Axes3D.plot_surface)
Matplotlibでは,等高線を3次元グラフで表示することができます
等高線に対応する3次元グラフは,Axes3D.plot_surfaceという曲面グラフの関数です
- 引数
-
- X, Y, Z (配列) : Zの値の座標で,XとYは両方ともZと同じ形状の2次元.X と Y は等間隔に値が並んでいる必要がある
- vmin, vmax (float) : 最大値と最小値
- **kwargs:ほかにも様々な引数がありますので,公式ドキュメントを参考にしてください
- 返値
- 公式ドキュメント
fig, ax = plt.subplots(subplot_kw={'projection': '3d'})
# 3Dグラフ
SF = ax.plot_surface(X, Y, Z, cmap='viridis')
# カラーバーの設定
cbar = fig.colorbar(SF, aspect=8)
cbar.ax.set_ylabel('Z Label')
plt.show()
参考文献
Axes.contourの公式ドキュメント
Axes.contourfの公式ドキュメント
シンプルな等高線グラフのデモ
塗りつぶした等高線グラフのデモ
3次元の曲面グラフ
お疲れ様でした
コメント