こんにちは。
meshgridって混乱しませんか?
今日はmeshgridを中心に書いていきます。
そしてそれを利用した等高線を書く為のメソッドであるcontourで遊ぼうと思います。
meshgridとは
meshgridは格子点を作るために使われます。
##格子点とは
つまり、この画像の点全てのことですね。座標平面上にある点で、x座標、y座標とも整数である点を格子点という。
さぁ、コードを書きます。
import numpy as np
x = [0, 1, 2, 3]
y = [0, 1, 2, 3]
X, Y = np.meshgrid(x, y)
XとYは以下のようになります。
何これ〜〜〜〜〜〜〜〜~~?!?!?!?!?!?!?!と思う人も多いかもしれませんが、もう少し頑張ってください。
これが何を表しているのかを整理しましょう。
最初の座標平面とこの行列がどう関係しているか見ていきます。
下記の画像を見てください。
どうですか?
少しはピンと来ましたか?
そう。XとYの行列の位置は平面上の座標と一致しているんです!(上下は転置されている)
つまり、行列の左上は座標では左下。
行列の右下に行くにつれて、座標では右上に行くのです。
この一致しているという事実を知っていれば、XとYの大きさは(len(y), len(x))となりますよね。
そしてlen(x) * len(y) = 格子点の数になります。
なぜかって?
まず紙に書いて、ゆっくり考えてみてください。
Xについて考えると、Xは必ず0か1しか要素として持ちません。
なぜなら、xという配列の中には0,1しかありませんからね。
そして0から1までを一つの棒と考えれば、y = 0, 100, 200に3本重ねれますよね。
これは、[0, 1]が3行必要ってことです。だからXの行列は3 * 2 = len(y) * len(x)なんですね。
Yも同じですよね。
結構まどろっこしい説明をしましたが、一言で言うと
行列の大きさは格子点の縦×横に等しいです
こうみるととても簡単だし、混乱も防げますよね。
それにしても美しい。
#meshgridを利用して等高線を書く。
import numpy as np
import matplotlib.pyplot as plt
# z = 2(x + y)
def f(x, y):
return 2 * (x + y)
x = [-1, 0, 1, 2, 3]
y = [-1, 0, 1, 2, 3]
X, Y = np.meshgrid(x, y)
fig, ax = plt.subplots()
cont = ax.contour(X, Y, f(X, Y), levels=[0, 2, 4]) # ここだけ説明。
cont.clabel(fmt='%1.1f', fontsize=14)
plt.show()
結果はこうなります。
実際 x = 2, y = -1 であれば、z = 2(2 - 1) = 2 * 1 = 2ですよね。
contourだけ説明しますね。
contour(X, Y, Z=f(X,Y), levels=[0, 2, 4])
まずcontourは等高線を求める為のツールです。
等高線とはx,yから導き出されるZの同じ値を結んだものです。
X,Yは格子点で、f(X,Y)でそれぞれの格子点でのZを求めています。
そのZにそって線を結んでいくんですね。それぞれの位置のZを知るために、格子点が必要となるわけです。
最後のlevelsは任意ですが、ここに指定されたものが線として表示されます。
#まとめ
今日はmeshgridを中心に書きました。
そしてmeshgridを使う等高線を書く為のツールであるcontourで遊んでみました。
meshgridはいろんな所で使います。
しっかり理解しておくことはマストでしょう。
ありがとうございました。
#参照文献
格子点とは?