カニカニクラブライフ

Python系技術メモ、書評とか

【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()

結果:
f:id:russENG:20170627072521p:plain
キャー。簡単。素敵。


参考:
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)

f:id:russENG:20170628200621p:plain
とんがり。

ZZ = np.sqrt(8**2 - (XX**2 + YY**2))

f:id:russENG:20170628201248p:plain
まる。

ZZ = -(XX**2 + YY**2)**2 + 2*XX**2 - 2*YY**2

f:id:russENG:20170628202658p:plain
これは、おっpカッシーニの卵形線というものだそうです。

参照:カッシーニの卵形線


ちなみに

ax.plot_surface(XX, YY, ZZ, rstride=5, cstride=5)

f:id:russENG:20170628203521p:plain

滑らかな表面プロット(名前がわからない)はこんな感じです。

それでは。