【Matplotlib】カラーバー付き等高線グラフを表示する方法 (contour, contourf, plot_surface)

等高線グラフの作成について悩んでいませんか?データの密度やパターンを的確に表現するためには、正しい方法で等高線グラフを作成する必要があります

Matplotlibであれば,少ないコードで簡単に等高線グラフを表示させることができます

本記事では,Matplotlibで等高線グラフを表示する方法について,データから描画までを通して解説します

また,3次元に対応したグラフについても解説しています

目次

等高線グラフのための3次元データの作成

等高線グラフはxとy座標に高さ方向のzを加えた3次元データになります

Matplotlibで用いる3次元データは工夫が必要になるため,本章で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列の行列になります

Axes.contour
引数
  • X (配列):Zの値の座標.XとYは両方ともZと同じ形状の2次元
  • Y (配列):X と Y は等間隔に値が並んでいる必要があります
  • Z (配列):等高線の高さ
  • levels (int or 配列):等高線の数や間隔
  • colors (文字列 or 配列) : 等高線の色
  • alpha (float) : 等高線の透明度
  • cmap (文字列 or カラーマップ) : 等高線の色.データ数値に合わせて色が変化
  • **kwargs:ほかにも様々な引数がありますので,公式ドキュメントを参考にしてください
返値
公式ドキュメント

下記のタブにコードとフローチャートの解説をしています

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と同じです

Axes.contourf
引数
  • X (配列):Zの値の座標.XとYは両方ともZと同じ形状の2次元
  • Y (配列):X と Y は等間隔に値が並んでいる必要があります
  • Z (配列):等高線の高さ
  • levels (int or 配列):等高線エリアの数や間隔
  • colors (文字列 or 配列) : 等高線エリアの色
  • alpha (float) : 等高線エリアの透明度
  • cmap (文字列 or カラーマップ) : 等高線エリアの色.データ数値に合わせて色が変化
  • **kwargs:ほかにも様々な引数がありますので,公式ドキュメントを参考にしてください
返値
公式ドキュメント

下記のタブにコードとフローチャートの解説をしています

# 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の配列を生成します

colors.Colormap
引数
  • 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という曲面グラフの関数です

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次元の曲面グラフ

お疲れ様でした

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次