等高線の描画
x と y のデータを numpy.meshgrid() に渡すと、xy平面上の格子点 (X, Y) を作成してくれます。1つ1つの格子点 X, Y について高度 Z を与えると、(X, Y, Z) の 3 次元データが完成するので、これをもとに等高線を描くことができます。
matplotlib.axes.Axes.contour()
(X, Y, Z) を matplotlib.axes.Axes.contour()に渡すと等高線を描くことができます。
$Z = X^2+Y^2$ の等高線を描いてみましょう。
# PYTHON_MATPLOTLIB_CONTOUR_01
import numpy as np
import matplotlib.pyplot as plt
# Figureを作成
fig = plt.figure(figsize = (5, 5))
# FigureにAxesを追加
ax = fig.add_subplot(111)
# 軸ラベルを設定
ax.set_xlabel("x", size = 14)
ax.set_ylabel("y", size = 14)
# 軸の範囲を設定
ax.set_xlim(-5, 5)
ax.set_ylim(-5, 5)
# 分割数
n = 128
# 範囲-5~5をn分割して(x,y)データを作成
x = np.linspace(-5, 5, n)
y = np.linspace(-5, 5, n)
# 格子点の作成
X, Y = np.meshgrid(x, y)
# 高度の計算式
Z = X**2 + Y**2
# 等高線を描く高度
h = [2, 6, 10, 14, 18]
# 等高線をプロット(カラーマップはhsv)
ct = ax.contour(X, Y, Z, cmap = "hsv", levels = h)
# 等高線ラベルを設定
ax.clabel(ct, fontsize = 12)
contour() の cmap にカラーマップを渡すことができます(指定しなくても自動で色が選択されます)。等高線の本数と間隔は levels に高度のリストを渡して調整します。一般には高度の間隔は一定にしておくことで、等高線が密なところは勾配が急であることがわかります。等高線ラベルは Axes.clabel() で表示します。このメソッドの第 1 引数には Axesオブジェクト(等高線)を渡します。
linestyles で "solid", "dashed", "dashdot", "dotted" の中から線の種類を選択することもできます。
matplotlib.axes.Axes.pcolormesh()
matplotlib.axes.Axes.pcolormesh() を使うとカラーマップで色分けされた等高線を描くことができます。
# PYTHON_MATPLOTLIB_CONTOUR_02
import numpy as np
import matplotlib.pyplot as plt
# 8×6サイズのFigureを追加
fig = plt.figure(figsize = (8, 6))
# FigureにAxesを追加
ax = fig.add_subplot(111)
# 軸ラベルを設定
ax.set_xlabel("x", size = 14)
ax.set_ylabel("y", size = 14)
# 軸の範囲を設定
ax.set_xlim(-5, 5)
ax.set_ylim(-5, 5)
# 分割数
n = 128
# 範囲-5~5をn分割して(x,y)データを作成
x = np.linspace(-5, 5, n)
y = np.linspace(-5, 5, n)
# 格子点の作成
X, Y = np.meshgrid(x, y)
# 高度の計算式
Z = X**2 + Y**2
# 等高線をプロット(カラーマップはBlues)
im = ax.pcolormesh(X, Y, Z, cmap = "Blues")
# カラーバーを表示
fig.colorbar(im)
最後の行で colorbar()メソッドを使って右横にカラーバーを表示させています。
このメソッドの引数には Axesオブジェクトを渡します。
次の記事の「3次元データの可視化」についての要望です。
Jupyter Notebook では、プログラムの実行結果を別ウィンドウで開けば 3D 表示をマウスで拡大したり回転させたり自由にできるようですが、Google Colab ではそれができません。3D 表示の仰角や xy 平面の方位角をプログラムで設定するための ax.view_init( elev=30, azim=-60 ) の説明を追加していただけるとありがたいです。
了解しました。新着記事で扱いたいと思います(「3次元データの可視化」の記事にリンクを貼ります)。仰角、方位角の定義の簡単な説明と、いくつかのサンプルコードを掲載する予定です。諸々の私用で立て込んでいて土日はあまり仕事できそうにないので、月曜日以降になると思いますが、なるべく早く投稿しようと思います。少々お待ちください。m(_ _)m
下記は誤植と思われますので、ご確認ください。
次の記事の「3次元データの可視化」のパラメータ曲線の説明で、どの縦軸とする変数 → 縦軸にとる変数
いつもありがとうございます。
直しておきました。m(_ _)m