3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Plotlyで3Dグラフを描く最初の一歩(Surface入門)

Posted at

はじめに

image.png

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

image.png

実行結果

  • マウスでドラッグ → グラフが回転
  • スクロール → ズームイン/アウト
  • 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方向の等高線が表示され、形状がより直感的にわかるようになります。

image.png

3. カメラ視点を変更

fig.update_layout(
    scene_camera=dict(
        eye=dict(x=1.5, y=1.5, z=1)
    )
)

eyeパラメータで視点を制御:

  • x, y, z の値を変えると俯瞰・側面など自由な角度から確認可能
  • 値が大きいほどグラフから遠ざかる

image.png

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)')
    )
)

軸タイトルを明示することで、数式とデータの関係がわかりやすくなります。

image.png

様々な関数で遊んでみる

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プレビューが非対応の場合あり

まとめ

image.png

Plotlyを使えば、わずか10行ほどでインタラクティブな3Dサーフェスを描画できます。
Google Colabでも追加インストールなしで動作し、WebGL対応のためブラウザ上で滑らかに表示できます。

Plotlyの3Dサーフェスは、さまざまな分野で応用できます。
数学関数の可視化や地形データの3D表示、機械学習モデルの損失関数の分析、物理シミュレーション結果の可視化など、教育・研究から実務まで幅広く活用できます。

Plotlyの3D可視化は、データサイエンスや科学技術計算の現場で非常に強力なツールです。ぜひこの記事をきっかけに、自分のデータやアイデアを3Dで表現してみてください!

参考リンク

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?