【matplotlib1000本ノック】 #0002 超簡単!3Dプロット
3Dプロット(3次元表示)をしましょう。理由は脳にいいからです。
matplotlibでの3Dプロットは軽く吐いちゃうくらい簡単です。
コード:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(111, projection='3d') X = np.arange(-10, 10, 0.1) Y = np.arange(-10, 10, 0.1) XX, YY = np.meshgrid(X, Y) ZZ = XX + YY ax.plot_wireframe(XX, YY, ZZ, rstride=5, cstride=5) plt.show()
結果:
キャー。簡単。素敵。
参考:
mplot3d example code: subplot3d_demo.py — Matplotlib 2.0.2 documentation
便利なmeshgrid関数
XX, YY = np.meshgrid(X, Y)
これ、なにをしているのでしょうか。
試しに、こうやってあげて・・・、
X = np.array([1,2,3]) Y = np.array([4,5]) XX, YY = np.meshgrid(X, Y)
中身を見てみやしょう。
XX Out[2]: array([[1, 2, 3], [1, 2, 3]]) YY Out[3]: array([[4, 4, 4], [5, 5, 5]])
XとYそれぞれについて、もう片方の要素の数だけ反復されています。
ZZ = XX+YY ZZ Out[59]: array([[5, 6, 7], [6, 7, 8]])
それによって、元のXとYの各要素についてなんかいい感じに総当たりの行列を得ることができます。
なので、数式を書くのと同じ感覚で2変数関数を書くことができるわけですね。
もっと詳しい解説:
【Python】ふたつの配列からすべての組み合わせを評価 - keisukeのブログ
色々書いてみる
ZZ = -1 * np.sqrt(XX**2 + YY**2)
とんがり。
ZZ = np.sqrt(8**2 - (XX**2 + YY**2))
まる。
ZZ = -(XX**2 + YY**2)**2 + 2*XX**2 - 2*YY**2
これは、おっpカッシーニの卵形線というものだそうです。
参照:カッシーニの卵形線
ちなみに
ax.plot_surface(XX, YY, ZZ, rstride=5, cstride=5)
滑らかな表面プロット(名前がわからない)はこんな感じです。
それでは。