これまでにもPlotlyの3次元グラフの描き方についての解説記事を書いてきましたが、今回は「Trisurf Plots」についてをまとめていきます!あまり聞き馴染みがない人が多いのではないかとも思いますが、簡単に説明すると三角形をつなげて3次元図形を表現する方法の一つです!(もう少し詳しい説明は下でします!)
Trisurf とは?
Trisurfとは、Tri-surfとも区切ることができ、Triangle(三角形)でSurface(表面)を表現するプロットです。
実際に、見てみるとわかりやすいと思うので、Plotlyの公式ドキュメントにも記されている トーラスの図形をお見せすると下図のような感じです!
Trisurf の基本構造 (描き方)
Trisurfの図示は共通部分が多いので、今回は球の図示を例にあげて描き方を順を追いながら説明していきます!
0. import
Plotly側では、今回はFigure Factoryを用いていきます!
scipy の Delaunay(ドロネー)は、三角形分割をするときに使います。
import plotly.figure_factory as ff
import numpy as np
from scipy.spatial import Delaunay
1. u,v の設定
パラメータ u,v の範囲設定 + 間隔の設定を行う。
(今回は、u,vともに 0から2π までの間で 10点を取る)
u = np.linspace(0, 2*np.pi, 10)
v = np.linspace(0, 2*np.pi, 10)
2. u,v の変形
1で設定したパラメータから、meshgrid関数で格子座標を作成。
そして、u,v をそれぞれflatten関数で1次元に変換しています。
u,v = np.meshgrid(u,v)
u = u.flatten()
v = v.flatten()
3. x,y,z座標を設定
上で設定したパラメータu,v を用いて x,y,z をパラメータ表示で設定していきます!
下の例は、球のパラメータ表示です。
x = np.cos(u) * np.cos(v)
y = np.cos(u) * np.sin(v)
z = np.sin(u)
4. simplices の計算
simplices自体は、simplex(単一な)という意味の複数形ですが、ここでは Plotlyでこの後設定を行う変数 simplicesについてです。
simplices : (ntri, 3)という形状の配列で、ntriは 三角形法における三角形の数のこと。
Delaunay により ドロネー分割を行い、simplicesの形に合うように変換を行っていきます。
points2D = np.vstack([u,v]).T
tri = Delaunay(points2D)
simplices = tri.simplices
5. create_trisurf
ff (figure_factory)の関数の一つの関数である「create_trisurf」を用いて、図示していきます!
今回は、用いていませんが、 aspectratio を設定することで各軸の比率を変えることができ、例であげたトーラスのような図形を表現しやすくすることができます!
fig = ff.create_trisurf(x=x, y=y, z=z,
simplices=simplices,
title="Sphere")
fig.show()
6. 完成した球の図
Trisurf の 図形の滑らかさの設定
上の図では、球というにしては少し角ばっていることが気になると思います。この要因は、下のようにパラメータを設定したと思いますが、n の数により作られる三角形の粒度が変わるため、それが図形全体の滑らかさにつながるというわけです。
u = np.linspace(0, 2*np.pi, n)
v = np.linspace(0, 2*np.pi, n)
実際に上で図示した図形では n = 10 でしたが、他の値についても試してみると、その滑らかさの違いがよくわかると思います!
n = 20
n = 50
かなり粒度が高くなり、球がかなりなめらかになっていることがわかります!
コメント