網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
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畫(huà)了正二十面體和足球:Python繪制正二十面體;畫(huà)足球,這次用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()
效果如下
原文鏈接:https://tinycool.blog.csdn.net/article/details/129076724
- 上一篇:沒(méi)有了
- 下一篇:沒(méi)有了
相關(guān)推薦
- 2022-02-05 Tableau:如何處理Excel中一個(gè)sheet中有多張表的問(wèn)題?
- 2023-07-26 node基于express+mongodb項(xiàng)目的整體結(jié)構(gòu)搭建和邏輯抽離
- 2022-09-16 Oracle查看表空間使用率以及爆滿解決方案詳解_oracle
- 2022-11-01 詳解批處理文件語(yǔ)法_DOS/BAT
- 2022-08-06 詳解C++圖搜索算法之雙端隊(duì)列廣搜_C 語(yǔ)言
- 2023-02-01 Bat腳本-Call,Start,直接調(diào)用,goto?四種方式調(diào)用批處理_DOS/BAT
- 2022-03-23 C++實(shí)現(xiàn)AVL樹(shù)的基本操作指南_C 語(yǔ)言
- 2022-07-11 跨域的五種解決方案
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支