これまで、Plotlyのグラフで3次元を作る例として、散布図や折れ線グラフを取り上げていきました。これらは平面のグラフでも同様なグラフがあり、それの3次元への拡張版といった形でしたが、今回紹介するのは 3次元だからこそ活かせる 「Surface Plots 」です!
平面・曲面を表現するのに便利な この Surface Plots をこの記事ではまとめていきます!
Plotlyについて、勉強したい方はこちらから!
今回使用するデータについて
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()
コメント