pythonのMatplotlibで等高線を描いてみたい方、この記事ではシンプルな等高線から、等高線に値を入れたり、等高線レベルに分けて色を設定する方法を紹介します.
スポンサーリンク
等高線データの作成
・始める前に本記事では以下のモジュールが必要です
メッシュグリッド(格子点)の作成
・x,yそれぞれにnp.linspace関数を使って等間隔で0~3の区間で値を20個作成します.
・x,yの配列からnp.meshgrid関数でグリッドを作成します.
・サンプルコードでグリッド作成までを確認します.
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
x = np.linspace(0, 3, 20) #等間隔で値を0~3まで20個作成
y = np.linspace(0, 3, 20) #等間隔で値を0~3まで20個作成
x, y = np.meshgrid(x, y) #x,yからメッシュグリッドを作成
scat=plt.scatter(x,y)
plt.show()
x,yの配列から,np.meshgridでグリッドを作成することができました.
グリッドの高さ設定
・グリッド座標x,yから,高さを配列zを作成します.
z方向の高さの式を以下のようにしました.
z=sin(x)+cos(y)+1
等高線を作成
・等高線の作成はAxes.contour([x,y],z,レベル,引数1,引数2…)より行います.
Axes.contour()の引数
引数 | 効果 |
x,y | 配列,x,yは同じ形状を持つ2Dである必要があります. |
z | 配列 ,等高線が描画される高さ |
レベル | 配列など等高線/領域の数を決定する. |
colors | 等高線の色 |
CMAP | カラーマップの選択 |
vmin,vmax | 等高線の最小値,最大値 |
等高線の値を表示
・等高線の値を表示するにはAxes.clabel()より行います.
・Axes.clabel()の引数
引数 | 効果 |
fontsize | 文字サイズ |
colors | 等高線の色 |
fmt | ラベルのフォーマット デフォルト: ‘%1.3f’ |
ax.clabel(fmt=’%1.1f’, fontsize=16) #等高線の値を表示
・等高線を表示さてみましょう
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
x = np.linspace(0, 3, 20) #等間隔でデータを0から20まで20個作成
y = np.linspace(0, 3, 20) #等間隔でデータを0から20まで20個作成
x, y = np.meshgrid(x, y) #xとyからメッシュグリッドを作成
def fz(x, y): #高さデータzを作る関数fzを定義
return np.sin(x)+np.cos(y)+1
z = fz(x, y) #関数fzを呼び出し高さデータzを作成.
ax = plt.contour(x,y,z,colors='black') #等高線表示
ax.clabel(fmt='%1.1f', fontsize=16) #等高線の値を表示
plt.show()
等高線表示できました.
等高線レベルに応じて色を塗る
・等高線レベルに応じて色を塗るにはAxes.contourf([x,y],z,レベル,引数1,引数2…)より行います.
Axes,conturf()の引数
引数 | 効果 |
x,y | 配列,x,yは同じ形状を持つ2Dである必要があります. |
z | 配列 等高線が描画される高さ |
レベル | 配列など等高線/領域の数を決定する. |
colors | レベルの色 |
cmap | カラーマップの選択 |
vmin,vmax | カラースケーリングの最小値、最大値 |
ax = plt.contourf(x,y,z,cmap=’rainbow’) #カラーマップに従って等高線に色を塗る
・カラーバーの表示
カーラーバーを表示するにはcolorbar()より行います.
ax = plt.colorbar(label=”contour level”)
・等高線レベルに応じて色を塗り、カラーバーを表示します.
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
x = np.linspace(0, 3, 20) #等間隔でデータを0から20まで20個作成
y = np.linspace(0, 3, 20) #等間隔でデータを0から20まで20個作成
x, y = np.meshgrid(x, y) #xとyからメッシュグリッドを作成
def fz(x, y): #高さデータzを作る関数fzを定義
return np.sin(x)+np.cos(y)+1
z = fz(x, y) #関数fzを呼び出し高さデータzを作成.
ax = plt.contour(x,y,z,colors='black') #等高線表示
ax.clabel(fmt='%1.1f', fontsize=16) #等高線の値を表示
ax = plt.contourf(x,y,z,cmap='rainbow') #等高線レベルに応じて色を塗る
ax = plt.colorbar(label="contour level") #カラーバー表示
plt.show()
等高線の高さによって色が変わりました.
等高線のレベルを調整
・等高線のレベルを変えるにはAxes.contor()とAxes.contorf()に引数として配列または関数を渡します.
等高線のレベルを0~3の範囲で20分割するように np.linespace(0,3.2,21)とします.
・先程作成したサンプルプログラムを下記に変えて実行します.
ax = plt.contour(x,y,z,np.linspace(0,3.2,21),colors='black')
ax.clabel(fmt='%1.1f', fontsize=16)
ax = plt.contourf(x,y,z,np.linspace(0,3.2,21),cmap='rainbow')
ax = plt.colorbar(label="contour level")
等高線が狙い通り表示されました.
コメント