Python利用plotly繪制正二十面體詳解
plotly 的 Python 軟件包是一個(gè)開(kāi)源的代碼庫(kù),它基于 plot.js,而后者基于 d3.js。我們實(shí)際使用的則是一個(gè)對(duì) plotly 進(jìn)行封裝的庫(kù),名叫 cufflinks,能讓你更方便地使用 plotly 和 Pandas 數(shù)據(jù)表協(xié)同工作。
一言以蔽之,plotly是一款擅長(zhǎng)交互的Python繪圖庫(kù),下面就初步使用一下這個(gè)庫(kù)的三維繪圖功能。此前曾經(jīng)用matplotlib畫了正二十面體和足球:Python繪制正二十面體;畫足球,這次用plotly復(fù)現(xiàn)一下正二十面體的繪制過(guò)程,也體驗(yàn)一下這兩個(gè)繪圖包的差異。
來(lái)繪制一個(gè)正二十面體。
頂點(diǎn)
正20面體的12個(gè)頂點(diǎn)剛好可以分為三組,每一組都是一個(gè)符合黃金分割比例的長(zhǎng)方形,而且這三個(gè)長(zhǎng)方形是互相正交的。
所以,想繪制一個(gè)正二十面體是比較容易的
import plotly import plotly.express as px import numpy as np from itertools import product G = (np.sqrt(5)-1)/2 def getVertex(): pt2 = [(a,b) for a,b in product([1,-1], [G, -G])] pts = [(a,b,0) for a,b in pt2] pts += [(0,a,b) for a,b in pt2] pts += [(b,0,a) for a,b in pt2] return np.array(pts) xs, ys, zs = getVertex().T fig = px.scatter_3d(x=xs, y=ys, z=zs, size=np.ones_like(xs)*0.5) fig.show()
得到頂點(diǎn)
棱
接下來(lái)連接這12個(gè)頂點(diǎn),由于點(diǎn)數(shù)較少,所以直接遍歷也不至于運(yùn)算量爆炸。另一方面,正二十面體邊長(zhǎng)相同,而這些相同的邊連接的也必然是最近的點(diǎn),所以接下來(lái)只需建立頂點(diǎn)之間的距離矩陣,并抽取出距離最短的線。
def getDisMat(pts): N = len(pts) dMat = np.ones([N,N])*np.inf for i in range(N): for j in range(i): dMat[i,j] = np.linalg.norm([pts[i]-pts[j]]) return dMat pts = getVertex() dMat = getDisMat(pts) # 由于存在舍入誤差,所以得到的邊的數(shù)值可能不唯一 ix, jx = np.where((dMat-np.min(dMat))<0.01)
接下來(lái),繪制正二十面體的棱
edges = [] for k in range(len(ix)): edges.append(pts[ix[k]].tolist() + [k]) edges.append(pts[jx[k]].tolist() + [k]) edges = np.array(edges) fig = px.line_3d(edges, x=0, y=1, z=2, color=3) fig.show()
效果如圖所示
實(shí)現(xiàn)正二十面體
接下來(lái)要對(duì)面上色。由于三棱成個(gè)面,所以只需得到所有三條棱的組合,只要這三條棱可以組成三角形,就能獲取所有的三角面。當(dāng)然,這一切的前提是,正二十面體只有30個(gè)棱,即使遍歷多次,也無(wú)非27k的計(jì)算量,是完全沒(méi)問(wèn)題的。
def isFace(e1, e2, e3): pts = np.vstack([e1, e2, e3]) pts = np.unique(pts, axis=0) return len(pts)==3 edges = [pts[[i,j]] for i,j in zip(ix, jx)] from itertools import combinations faces = [es for es in combinations(edges, 3) if isFace(*es)]
最后得到的faces有20個(gè)元素,每個(gè)元素由3條棱組成,每條棱有兩個(gè)頂點(diǎn),故而可以縮減為三個(gè)頂點(diǎn)。
ptFace = [np.unique(np.vstack(f),axis=0) for f in faces] ptFace = np.vstack(ptFace)
接下來(lái)繪制一下,plotly繪制三角面的邏輯是,除了需要指定三角面的三個(gè)坐標(biāo)之外,還需指定三角面的頂點(diǎn)序號(hào)
import plotly.figure_factory as ff simplices = np.arange(len(ptFace)).reshape(-1,3) fig = ff.create_trisurf(x=ptFace[:,0], y=ptFace[:,1], z=ptFace[:,2], simplices=simplices) fig.show()
效果如下
以上就是Python利用plotly繪制正二十面體詳解的詳細(xì)內(nèi)容,更多關(guān)于Python plotly繪制正二十面體的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python可視化工具Plotly的應(yīng)用教程
- python用plotly實(shí)現(xiàn)繪制局部放大圖
- Python使用Plotly繪制常見(jiàn)5種動(dòng)態(tài)交互式圖表
- Python+Plotly繪制精美的數(shù)據(jù)分析圖
- Python進(jìn)行數(shù)據(jù)可視化Plotly與Dash的應(yīng)用小結(jié)
- 詳解如何使用Python的Plotly庫(kù)進(jìn)行交互式圖形可視化
- python使用Plotly創(chuàng)建交互式數(shù)據(jù)可視化的操作步驟
- Python?Plotly庫(kù)安裝及使用教程
- Python-Plotly庫(kù)實(shí)現(xiàn)數(shù)據(jù)動(dòng)態(tài)可視化的示例代碼
相關(guān)文章
詳解python3安裝pillow后報(bào)錯(cuò)沒(méi)有pillow模塊以及沒(méi)有PIL模塊問(wèn)題解決
這篇文章主要介紹了python3安裝pillow后報(bào)錯(cuò)沒(méi)有pillow模塊以及沒(méi)有PIL模塊問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Python協(xié)程方式的實(shí)現(xiàn)及意義筆記分享
協(xié)程也被稱為微線程,是一種用戶態(tài)的上下文切換技術(shù),簡(jiǎn)而言之,就是通過(guò)一個(gè)線程實(shí)現(xiàn)代碼互相切換執(zhí)行,本文主要給大家介紹實(shí)現(xiàn)協(xié)程的幾種方法2021-09-09使用pandas忽略行列索引,縱向拼接多個(gè)dataframe
這篇文章主要介紹了使用pandas忽略行列索引,縱向拼接多個(gè)dataframe的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03Python實(shí)現(xiàn)Ollama的提示詞生成與優(yōu)化
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)Ollama的提示詞生成與優(yōu)化的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12Pandas數(shù)據(jù)集的分塊讀取的實(shí)現(xiàn)
本文主要介紹了Pandas數(shù)據(jù)集的分塊讀取的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08python中sort和sorted排序的實(shí)例方法
在本篇文章中小編給大家?guī)?lái)的是關(guān)于python中sort和sorted排序的實(shí)例方法以及相關(guān)知識(shí)點(diǎn),有需要的朋友們可以學(xué)習(xí)下。2019-08-08Python利用Charles 實(shí)現(xiàn)全部自動(dòng)答題思路流程分析
這篇文章主要介紹了Python利用Charles 實(shí)現(xiàn)全部自動(dòng)答題思路流程分析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08Python 實(shí)現(xiàn) 貪吃蛇大作戰(zhàn) 代碼分享
本文給大家分享的是一個(gè)使用cocos2d-python游戲引擎庫(kù)制作出來(lái)的貪吃蛇大作戰(zhàn)的游戲代碼,基于Python 2.7 和 cocos2d 庫(kù),有需要的小伙伴可以參考下2016-09-09python使用pgzero進(jìn)行游戲開(kāi)發(fā)
今天要和大家分享的pgzero(pygame zero)是在pygame基礎(chǔ)上做了進(jìn)一步的封裝,使得設(shè)計(jì)一款游戲十分的方便,特別適合少兒編程領(lǐng)域的教學(xué), 與scratch相得益彰。2021-06-06