なんでもかんでもJupyter Notebookに表示するためのチートシート　３次元プロット編

# 3次元の曲線をプロット
プロットするデータはこれ

```py3:Notebook
import numpy as np
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
```


---
## Matplotlib

```py3:Notebook
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d    # <- 明示的には使わないが、インポートしておく必要がある。
# Notebook出力には次の１行が必要（%matplotlib inlineだとグラフを回転できない）
%matplotlib notebook

fig = plt.figure()
ax = fig.gca(projection='3d')    # <- axes3dをインポートしていないとエラーになる。
ax.plot(x, y, z)
plt.show()
```
<img width="367" alt="3D曲線_Matplotlib.png" src="https://qiita-image-store.s3.amazonaws.com/0/37701/b4b4db96-fa14-fe63-da8c-9c2704cc38a7.png">
公式ドキュメント：[Line plots - mplot3d tutorial](http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#line-plots)


---
## Plotly
```py3:Notebook
from plotly.graph_objs import Scatter3d
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode()    # <- Notebook出力にはこの１行が必要

scatter = Scatter3d(x=x, y=y, z=z, mode='lines')
iplot([scatter])    # <- Notebookに出力するにはiplot関数を使う
```
<img width="419" alt="3D曲線_Plotly.png" src="https://qiita-image-store.s3.amazonaws.com/0/37701/31ac93bb-857e-24ca-dea8-8580753b3c6d.png">
公式ドキュメント：[3D Line Plots in Python](https://plot.ly/python/3d-line-plots/)


---
## Mayavi
```py3:Notebook
from mayavi import mlab
mlab.init_notebook()    # <- Notebook出力にはこの１行が必要

mlab.figure()
mlab.plot3d(x, y, z, tube_radius=0.1)    # tube_radiusは線の太さ（省略可）
```
<img width="493" alt="3D曲線_Mayavi.png" src="https://qiita-image-store.s3.amazonaws.com/0/37701/c234e055-5df5-3bfb-4c77-15bb3591b9d6.png">
公式ドキュメント：[plot3d - Plotting functions](http://docs.enthought.com/mayavi/mayavi/auto/mlab_helper_functions.html#plot3d)


---
# 3次元の散布図をプロット
プロットするデータはこれ

```py3:Notebook
import numpy as np
X = np.random.uniform(-10, 10, 200)
Y = np.random.uniform(-10, 10, 200)
Z = np.random.uniform(-10, 10, 200)
```


---
## Matplotlib
```py3:Notebook
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d    # <- 明示的には使わないが、インポートしておく必要がある。
# Notebook出力には次の１行が必要（%matplotlib inlineだとグラフを回転できない）
%matplotlib notebook

fig = plt.figure()
ax = fig.gca(projection='3d')    # <- axes3dをインポートしていないとエラーになる。
scatter = ax.scatter3D(X, Y, Z,
                       s=5,                    # マーカーのサイズ
                       c=Z,                    # 色分けに使う数値（任意の数値を指定可）
                       cmap=plt.cm.viridis)    # 色のパターン
plt.colorbar(scatter)                          # カラーバーを表示（省略可）
plt.show()
```
<img width="375" alt="3D散布図_Matplotlib.png" src="https://qiita-image-store.s3.amazonaws.com/0/37701/dc93a5b7-fc6d-a1d5-17e1-ce7260879348.png">
公式ドキュメント：[Scatter plots - mplot3d tutorial](http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#scatter-plots)


---
## Plotly
```py3:Notebook
from plotly.graph_objs import Scatter3d
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode()    # <- Notebook出力にはこの１行が必要

# color、colorscale、showscaleは省略可
scatter = Scatter3d(x=X, y=Y, z=Z, mode='markers',
                    marker=dict(size=1,                  # マーカーのサイズ
                                color=Z,                 # 色分けに使う数値（任意の数値を指定可）
                                colorscale='Viridis',    # 色のパターン
                                showscale=True)          # カラーバーを表示
                   )

iplot([scatter])    # <- Notebookに出力するにはiplot関数を使う
```
<img width="411" alt="3D散布図_Plotly.png" src="https://qiita-image-store.s3.amazonaws.com/0/37701/ba8779f6-8e6e-a661-104e-9d8459b8dda2.png">
公式ドキュメント：[3D Scatter Plots in Python](https://plot.ly/python/3d-scatter-plots/)


---
## Mayavi
```py3:Notebook
from mayavi import mlab
mlab.init_notebook()    # <- Notebook出力にはこの１行が必要

mlab.figure()
mlab.points3d(X, Y, Z,
              Z,                     # 色分けに使う数値（任意の数値を指定可）
              scale_mode='none',     # マーカーを同じサイズで表示
              scale_factor=0.5,      # マーカーのサイズ
              colormap='viridis')    # 色のパターン
```
<img width="493" alt="3D散布図_Mayavi.png" src="https://qiita-image-store.s3.amazonaws.com/0/37701/d18a5722-fd68-0a0f-d838-1220b7bf55c3.png">
公式ドキュメント：[points3d - Plotting functions](http://docs.enthought.com/mayavi/mayavi/auto/mlab_helper_functions.html#points3d)


---
# 格子状に並んだ2.5次元データをプロット
プロットするデータはこれ

```py3:Notebook
from mpl_toolkits.mplot3d.axes3d import get_test_data
X, Y, Z = get_test_data()
```


---
## Matplotlib
```py3:Notebook
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d    # <- 明示的には使わないが、インポートしておく必要がある。
# Notebook出力には次の１行が必要（%matplotlib inlineだとグラフを回転できない）
%matplotlib notebook

fig = plt.figure()
ax = fig.gca(projection='3d')    # <- axes3dをインポートしていないとエラーになる。
ax.plot_surface(X, Y, Z,
                cmap=plt.cm.viridis)    # 色のパターン（省略可）
plt.show()
```
<img width="363" alt="3Dサーフェス_Matplotlib.png" src="https://qiita-image-store.s3.amazonaws.com/0/37701/95cf536b-6924-c087-3a61-17a3952ea52d.png">
公式ドキュメント：[Surface plots - mplot3d tutorial](http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#surface-plots)


---
## Plotly
```py3:Notebook
from plotly.graph_objs import Surface
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode()    # <- Notebook出力にはこの１行が必要

surface = Surface(x=X, y=Y, z=Z,
                  colorscale='Viridis')    # 色のパターン（省略可）
iplot([surface])    # <- Notebookに出力するにはiplot関数を使う
```
<img width="403" alt="3Dサーフェス_Plotly.png" src="https://qiita-image-store.s3.amazonaws.com/0/37701/f30b2ece-953e-f6d5-4213-05144cbd5370.png">
公式ドキュメント：[3D Surface Plots in Python](https://plot.ly/python/3d-surface-plots/)


---
## Mayavi
```py3:Notebook
from mayavi import mlab
mlab.init_notebook()    # <- Notebook出力にはこの１行が必要

mlab.figure()
mlab.surf(Z,
          colormap='viridis',    # 色のパターン
          warp_scale='auto')     # Z軸のスケールを自動的に調整する
```
<img width="491" alt="3Dサーフェス_Mayavi.png" src="https://qiita-image-store.s3.amazonaws.com/0/37701/ce97352c-4faf-560e-f1de-2b5b58f33219.png">
公式ドキュメント：[surf - Plotting functions](http://docs.enthought.com/mayavi/mayavi/auto/mlab_helper_functions.html#surf)


---
# 不規則に並んだ2.5次元データをプロット
プロットするデータはこれ

```py3:Notebook
import numpy as np
X = np.random.uniform(-10, 10, 1000)
Y = np.random.uniform(-10, 10, 1000)
Z = X ** 2 + Y ** 2
```


---
## Matplotlib
```py3:Notebook
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d    # <- 明示的には使わないが、インポートしておく必要がある。
# Notebook出力には次の１行が必要（%matplotlib inlineだとグラフを回転できない）
%matplotlib notebook

fig = plt.figure()
ax = fig.gca(projection='3d')                    # <- axes3dをインポートしていないとエラーになる。
ax.plot_trisurf(X, Y, Z, cmap=plt.cm.viridis)    # cmapは色のパターン（省略可）
plt.show()
```
<img width="362" alt="3Dメッシュ_Matplotlib.png" src="https://qiita-image-store.s3.amazonaws.com/0/37701/0599c84c-d5b3-3630-0e95-78e286414d20.png">
公式ドキュメント：[Tri-Surface plots - mplot3d tutorial](http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#tri-surface-plots)


---
## Plotly
```py3:Notebook
from plotly.graph_objs import Mesh3d
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode()    # <- Notebook出力にはこの１行が必要

mesh = Mesh3d(x=X, y=Y, z=Z,
              delaunayaxis='z')    # 三角形分割する時に投影する方向
iplot([mesh])    # <- Notebookに出力するにはiplot関数を使う
```
<img width="316" alt="3Dメッシュ_Plotly.png" src="https://qiita-image-store.s3.amazonaws.com/0/37701/8431811e-4cf9-96ca-1854-5d8ae0d8c7a4.png">
公式ドキュメント：[Surface Triangulation in Python](https://plot.ly/python/surface-triangulation/)


# 参考リンク
[Jupyter notebookでMayaviを使う時の設定 - Qiita](http://qiita.com/2dod/items/9fbf1fc052d74bef12cd)
[Pythonの可視化パッケージの使い分け - Qiita](http://qiita.com/alchemist/items/544d45480ce9c1ca2c16)
[なんでもかんでもJupyter Notebookに表示するためのチートシート　２次元プロット編 - Qiita](http://qiita.com/alchemist/items/f528e77f195eb65a04df)