Python利用plotly绘制正二十面体详解

作者:微小冷 时间:2021-07-25 13:14:27 

plotly 的 Python 软件包是一个开源的代码库,它基于 plot.js,而后者基于 d3.js。我们实际使用的则是一个对 plotly 进行封装的库,名叫 cufflinks,能让你更方便地使用 plotly 和 Pandas 数据表协同工作。

一言以蔽之,plotly是一款擅长交互的Python绘图库,下面就初步使用一下这个库的三维绘图功能。此前曾经用matplotlib画了正二十面体和足球:Python绘制正二十面体;画足球,这次用plotly复现一下正二十面体的绘制过程,也体验一下这两个绘图包的差异。
来绘制一个正二十面体。

顶点

正20面体的12个顶点刚好可以分为三组,每一组都是一个符合黄金分割比例的长方形,而且这三个长方形是互相正交的。

所以,想绘制一个正二十面体是比较容易的

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()

得到顶点

Python利用plotly绘制正二十面体详解

接下来连接这12个顶点,由于点数较少,所以直接遍历也不至于运算量 * 。另一方面,正二十面体边长相同,而这些相同的边连接的也必然是最近的点,所以接下来只需建立顶点之间的距离矩阵,并抽取出距离最短的线。

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)
# 由于存在舍入误差,所以得到的边的数值可能不唯一
ix, jx = np.where((dMat-np.min(dMat))<0.01)

接下来,绘制正二十面体的棱

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()

效果如图所示

Python利用plotly绘制正二十面体详解

实现正二十面体

接下来要对面上色。由于三棱成个面,所以只需得到所有三条棱的组合,只要这三条棱可以组成三角形,就能获取所有的三角面。当然,这一切的前提是,正二十面体只有30个棱,即使遍历多次,也无非27k的计算量,是完全没问题的。

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个元素,每个元素由3条棱组成,每条棱有两个顶点,故而可以缩减为三个顶点。

ptFace = [np.unique(np.vstack(f),axis=0) for f in faces]
ptFace = np.vstack(ptFace)    

接下来绘制一下,plotly绘制三角面的逻辑是,除了需要指定三角面的三个坐标之外,还需指定三角面的顶点序号

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绘制正二十面体详解

来源:https://tinycool.blog.csdn.net/article/details/129076724

标签:Python,plotly,正二十面体
0
投稿

猜你喜欢

  • Python函数递归调用实现原理实例解析

    2023-01-16 12:00:52
  • 一步步教你用python给女朋友写个微信自动提醒的程序

    2022-09-03 16:50:25
  • http协议详解(超详细)

    2023-01-20 23:27:31
  • 从web到内网渗透的一次过程详解

    2023-05-20 21:23:08
  • Golang学习笔记之安装Go1.15版本(win/linux/macos/docker安装)

    2024-05-13 10:41:23
  • Google投放广告的js的分析

    2008-07-15 11:34:00
  • 深入理解pytorch库的dockerfile

    2021-01-11 23:28:54
  • Oracle与Mysql主键、索引及分页的区别小结

    2024-01-16 03:55:51
  • python定间隔取点(np.linspace)的实现

    2022-05-01 12:30:25
  • 微软:跑分速度不是IE8的开发重点

    2008-09-12 12:10:00
  • python直接调用和使用swig法方调用c++库

    2021-05-26 11:08:26
  • python 实现的截屏工具

    2023-05-15 00:20:39
  • js实现的星星评分功能函数

    2024-06-16 10:28:07
  • 品牌的统一体验

    2010-05-19 13:08:00
  • python条件语句和while循环语句

    2023-08-31 06:17:56
  • 快速解决Golang Map 并发读写安全的问题

    2024-04-30 10:03:46
  • 改善IE6中a与a:hover的背景支持

    2009-11-27 18:50:00
  • python静态web服务器实现方法及代码详解

    2023-01-13 17:17:12
  • 获取Dom元素的X/Y坐标

    2009-10-10 12:49:00
  • 10个ASP网页制作技巧

    2007-09-24 13:12:00
  • asp之家 网络编程 m.aspxhome.com