plotlyで3次元表示


今年の年賀状の中心のなる図では、海洋予測モデルの流速を3次元地形と一緒に表示した。

plotlyで作成した。Jupyterlab上でぐりぐり動かすこともできる。

データを読み込む所は省略して、図を描く部分のコードは以下の通り。
go.Surfaceが3次元的に地形を描くところで、xがx軸、yがy軸、地形のデータがzに入っている。Ctopoは彩色のためのカラースケール。
go.Coneが流速のベクトルを3次元コーンで表現した部分。(xv,yv,zv)に3次元座標、(uv,vv,wv)に3次元ベクトルデータが入っている。
layoutでは図のアスペクト比を変えたり、座標軸を表示させなくしたりしている。

import plotly.graph_objects as go


Ctopo = [[0, 'rgb(0, 0, 70)'],[0.2, 'rgb(0,90,150)'], 
          [0.4, 'rgb(150,180,230)'], [0.5, 'rgb(210,230,250)'],
          [0.50001, 'rgb(0,120,0)'], [0.57, 'rgb(220,180,130)'], 
          [0.65, 'rgb(120,100,0)'], [0.75, 'rgb(80,70,0)'], 
          [0.9, 'rgb(200,200,200)'], [1.0, 'rgb(255,255,255)']]

fig = go.Figure(data=[go.Surface(z=z, x=x, y=y,showscale=False,colorscale=Ctopo,cmin=-3000,cmax=3000),
                      go.Cone(x=xv,y=yv,z=zv,u=uv,v=vv,w=wv,sizemode="absolute",sizeref=0.05,colorscale="turbo",opacity=0.5,cmin=0,cmax=1.5,showscale=False)])


noaxis=dict(showbackground=False,
            showgrid=False,
            showline=False,
            showticklabels=False,
            ticks='',
            title='',
            zeroline=False)


fig.update_layout( 
    width=1500, height=500,
    margin=dict(l=0, r=0, b=0, t=0),
    scene_aspectmode='manual',
    scene_aspectratio=dict(x=2, y=1, z=0.7),
    scene = dict(
        xaxis = noaxis,
        yaxis = noaxis,
        zaxis = noaxis)
    )
fig.show()