等高線を描くのに必要なデータは 2 つあります。
マス目で区切られた底面、そして、マス目の交点における高さです。

マス目の作り方、そして高さをあわせた描画方法を見ていきます。
- 目次 -
スポンサーリンク
meshgrid でマス目を作る
交点
numpy の meshgrid を使うとマス目の交点が簡単に作れます。
たとえば、図のようなマス目の場合

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import numpy as np # x軸 x = np.linspace(0, 2, 3) #------------------------ # array([ 0., 1., 2.]) #------------------------ # y軸 y = np.linspace(0, 200, 3) #------------------------------ # array([ 0., 100., 200.]) #------------------------------ X, Y = np.meshgrid(x, y) X #---------------------------------- # [array([[ 0., 1., 2.], # [ 0., 1., 2.], # [ 0., 1., 2.]]), #---------------------------------- Y #---------------------------------- # array([[ 0., 0., 0.], # [ 100., 100., 100.], # [ 200., 200., 200.]])] #---------------------------------- |
出来上がる 2 つの配列 X、Y は同じサイズです。そして、両配列の要素を組み合わせるとマス目の交点になります。

交点
<----------->

計 9 個の交点ができあがります。
高さ
あとは、この交点ごとの高さがあればばデータは揃います。
地図を描くような場合は高さとして測量データを用いますが、幾何学模様を描く場合は X と Y から 高さを計算します。たとえば、原点からの距離を高さにするなら
1 2 3 4 5 6 |
np.sqrt(X**2 + Y**2) #------------------------------------------------------- # array([[ 0. , 1. , 2. ], # [ 100. , 100.00499988, 100.019998 ], # [ 200. , 200.00249998, 200.00999975]]) #------------------------------------------------------- |
となります。
描画は contour
描画 は matplotlib の contour で行います。
実際に描画してみます。上の例ではさすがにデータが少ないので、交点を 100 × 100 に増やします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import numpy as np import matplotlib.pyplot as plt n = 100 x = np.linspace(-1, 1, n) y = np.linspace(-1, 1, n) X, Y = np.meshgrid(x, y) Z = np.sqrt(X**2 + Y**2) # # meshgrid で作った X と Y、そして高さ Z を contour に渡す # plt.contour(X, Y, Z) plt.gca().set_aspect('equal') plt.show() |

色指定
色の指定は colors で行います。
1 |
plt.contour(X, Y, Z, colors=['r','b']) |

本数と間隔
等高線の本数と間隔は levels で指定できます。線を引きたい高さを配列で指定します。
1 |
plt.contour(X, Y, Z, levels=[0.2, 0.4, 1.0]) |

ラベル
contour が返却するインスタンスを使ってラベルを付加できます。
1 2 |
cont = plt.contour(X, Y, Z, levels=[0.2, 0.4, 1.0]) cont.clabel(fmt='%1.1f', fontsize=14) |

スポンサーリンク
その他の記事
Mustuo Oyama says:
Pythonを使えば、こんなに簡単にコンターマップを作れるのですね。
ただ、気圧のコンターマップのように、交点(気圧計が無い)のZの値が判らないような場合は、どのようなアルゴリズムになるのでしょうか知りたいです。・・・というかそれが必要です。