はじめに
「3Dグラフを作りたいけど、どこから始めればいいかわからない」
「matplotlibの3Dは使いづらい...」
そんな方におすすめなのが Plotly です。Google Colabでもブラウザでも、わずか数行でインタラクティブな3Dサーフェスグラフを作成できます。
この記事で得られること
- Plotlyで3Dサーフェス(立体関数グラフ)を描く基本
- Google ColabやJupyter上で回転・ズーム可能な3D可視化を体験
- NumPy配列から直接グラフを生成する方法
実装例
まずは以下のコードをGoogle ColabやJupyterにコピー&ペーストして実行してみましょう。
import plotly.graph_objects as go
import numpy as np
# 3Dデータを作成(関数z=f(x,y))
x = np.linspace(-2, 2, 50)
y = np.linspace(-2, 2, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
# PlotlyでSurface描画
fig = go.Figure(data=[go.Surface(x=X, y=Y, z=Z, colorscale='Viridis')])
fig.update_layout(
title="3D Surface: z = sin(√(x² + y²))",
scene=dict(aspectmode='data')
)
fig.show()
実行結果
- マウスでドラッグ → グラフが回転
- スクロール → ズームイン/アウト
- Colabでもそのまま動作(追加インストール不要)
コードの構造を理解する
| 要素 | 役割 |
|---|---|
np.meshgrid |
X, Y 座標の格子を生成 |
np.sin(np.sqrt(...)) |
Z値の関数定義(波形パターン) |
go.Surface() |
3Dサーフェスを描画 |
colorscale='Viridis' |
カラーマップ設定(色の配色) |
aspectmode='data' |
軸のスケールを自動調整 |
meshgridとは?
np.meshgridは、1次元の座標配列から2次元の格子座標を生成します。
x = np.array([0, 1, 2])
y = np.array([0, 1])
X, Y = np.meshgrid(x, y)
# X = [[0, 1, 2],
# [0, 1, 2]]
# Y = [[0, 0, 0],
# [1, 1, 1]]
この格子上の各点に対してZ値を計算することで、3Dサーフェスが生成されます。
Stepアップ:カスタマイズして理解を深める
1. カラーマップを変更
fig = go.Figure(data=[go.Surface(x=X, y=Y, z=Z, colorscale='Plasma')])
fig.show()
利用可能なカラーマップ例:
-
Viridis- 緑〜青〜紫の視認性の高いマップ -
Plasma- 紫〜ピンク〜黄のビビッドなマップ -
Cividis- 色覚多様性に配慮したマップ -
Turbo- Rainbowの改良版
2. 等高線を追加
fig = go.Figure(data=[go.Surface(x=X, y=Y, z=Z, colorscale='Viridis')])
fig.update_traces(
contours_z=dict(
show=True,
usecolormap=True,
highlightcolor="limegreen",
project_z=True
)
)
fig.show()
Z方向の等高線が表示され、形状がより直感的にわかるようになります。
3. カメラ視点を変更
fig.update_layout(
scene_camera=dict(
eye=dict(x=1.5, y=1.5, z=1)
)
)
eyeパラメータで視点を制御:
-
x,y,zの値を変えると俯瞰・側面など自由な角度から確認可能 - 値が大きいほどグラフから遠ざかる
4. 軸ラベルと背景を整える
fig.update_layout(
title='3D Surface Demo',
scene=dict(
xaxis_title='X Axis',
yaxis_title='Y Axis',
zaxis_title='Z Axis',
xaxis=dict(backgroundcolor='rgb(230,230,230)'),
yaxis=dict(backgroundcolor='rgb(230,230,230)'),
zaxis=dict(backgroundcolor='rgb(240,240,240)')
)
)
軸タイトルを明示することで、数式とデータの関係がわかりやすくなります。
様々な関数で遊んでみる
sin×cosの干渉パターン
Z = np.sin(X) * np.cos(Y)
波の干渉模様が美しい幾何学パターンを作ります。
放射状リップル
Z = np.sin(X**2 + Y**2)
中心から広がる波紋のような模様が生成されます。
ガウス分布の丘
Z = np.exp(-(X**2 + Y**2))
中心が最も高く、外側に向かって滑らかに減衰する形状になります。
たった1行変えるだけで、全く異なる立体グラフが生成されるのがPlotlyの魅力です。
実用的な小技集
グラフをHTMLファイルとして保存
fig.write_html("surface.html")
生成されたHTMLファイルは単体で動作するため、メール添付やWebサーバーへのアップロードが可能です。
描画サイズを調整
fig.update_layout(width=800, height=600)
背景を透明にしてスライド用に出力
fig.update_layout(
paper_bgcolor='rgba(0,0,0,0)',
plot_bgcolor='rgba(0,0,0,0)'
)
プレゼンテーションのスライドに埋め込む際に便利です。
トラブルシューティング
| 症状 | 対処法 |
|---|---|
| グラフが表示されない | セルを再実行、またはブラウザを更新(Colab側の一時的なバグの可能性) |
| 真っ白な枠だけ表示される |
fig.show() が記述されているか確認 |
| Colabで処理が止まる | 出力データ量が大きすぎる → meshサイズを50×50以下に削減 |
| HTML出力が崩れる | ファイルを再ダウンロード。Colabプレビューが非対応の場合あり |
まとめ
Plotlyを使えば、わずか10行ほどでインタラクティブな3Dサーフェスを描画できます。
Google Colabでも追加インストールなしで動作し、WebGL対応のためブラウザ上で滑らかに表示できます。
Plotlyの3Dサーフェスは、さまざまな分野で応用できます。
数学関数の可視化や地形データの3D表示、機械学習モデルの損失関数の分析、物理シミュレーション結果の可視化など、教育・研究から実務まで幅広く活用できます。
Plotlyの3D可視化は、データサイエンスや科学技術計算の現場で非常に強力なツールです。ぜひこの記事をきっかけに、自分のデータやアイデアを3Dで表現してみてください!





