Plotly 3D Surface Plots の描き方

plotly使い方

 これまで、Plotlyのグラフで3次元を作る例として、散布図や折れ線グラフを取り上げていきました。これらは平面のグラフでも同様なグラフがあり、それの3次元への拡張版といった形でしたが、今回紹介するのは 3次元だからこそ活かせる 「Surface Plots 」です!
 平面・曲面を表現するのに便利な この Surface Plots をこの記事ではまとめていきます!

今回使用するデータについて

Plotly のデータセットから、 Brono山の標高をまとめたデータがありましたので、それを用いていきます!

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/api_docs/mt_bruno_elevation.csv')
スポンサーリンク

Surface Plots 入門編

 今回描いていく図は、こちらです! きれいに山の形が描画できてますね!
カーソルを合わせると、各座標での標高がz軸成分として表示されることがわかると思います!

基本文法

go.Surface で Surface Plots を書くことができます! (他の3次元グラフの Scatter3d のように 3dがつかないことに注意!)
書き方は大きく分けて2つあります!
➀ z 軸成分のみを指定 : データフレームを扱うときにおすすめ。(データフレームの行列をそれぞれx,y軸, 値をz軸成分と設定できます!)

go.Surface(z=df.values)


➁ x, y, z の各軸成分を指定

go.Surface(z="z座標", x= "x座標", y= "y座標")

サンプルコード

 基本文法を押さえていれば、Surface Plotは描くことができます!
ここでは、グラフのタイトルだけ加えると、上の図を描くことができました!

import plotly.graph_objects as go
import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/api_docs/mt_bruno_elevation.csv').drop('Unnamed: 0',axis=1)

fig = go.Figure()
fig.add_trace(
 go.Surface(z=df.values)
)
fig.update_layout(title='Bruno山 の標高')

fig.show()

スポンサーリンク

Surface Plots 実践編

入門編では、Surface Plots を描く上での最低限の内容をまとめました。
ここでは、そこからさらに上のレベルとして、グラフ内の機能と、グラフのレイアウトを一つずつ updateして下のような図を作っていきます!

追加機能1 等高線の追加

3次元のグラフの 上部に等高線を投影することができます。
go.Surface内の contours_z という引数で設定することができ、このように設定します!

go.Surface(z=df.values,
contours_z=dict(show=True, usecolormap=True, highlightcolor="limegreen", project_z=True))

 contours_z 内の引数の説明は以下の通り

show

z次元に関する輪郭線を描画するか否か?

usecolormap

輪郭線を "colorscale" を用いて色をつけるか否か?

highlightcolor

ハイライトされた 輪郭線の色を設定

project_z

z軸に対して投影するか否か?

追加機能2 グラフの視点を変更

 入門編で描いたグラフだと、3次元グラフの上部側がデフォルトだと見えなく、等高線が見えないので、はじめのカメラの位置(投影方向)をレイアウトで追加設定します!

 下のコードのように、scene_camera_eyeで設定でき、x, y, z 座標を辞書型で設定します!

fig.update_layout(title='Mt Bruno Elevation',
                   scene_camera_eye=dict(x=1.87, y=0.88, z=-0.56),
)

サンプルコード

 追加機能 1, 2をまとめるとこのコードのようになります!

import plotly.graph_objects as go
import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/api_docs/mt_bruno_elevation.csv').drop('Unnamed: 0',axis=1)

fig = go.Figure()
fig.add_trace(
 go.Surface(z=df.values,contours_z=dict(show=True, usecolormap=True,
                                 highlightcolor="limegreen", project_z=True))
)
fig.update_layout(title='Mt Bruno Elevation',
                    scene_camera_eye=dict(x=1.87, y=0.88, z=-0.56),
)

fig.show()

コメント

タイトルとURLをコピーしました