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求均值,方差,标准差的实例

    2021-04-10 08:14:31
  • ASP名次排列函数

    2008-07-20 13:42:00
  • Python 浪漫烟花实现代码全解

    2023-11-16 01:24:56
  • 浅谈Python响应式类库RxPy

    2021-12-24 12:44:26
  • 用户如何有效地利用ORACLE数据字典

    2008-03-04 18:19:00
  • python 将列表中的字符串连接成一个长路径的方法

    2023-04-18 14:06:25
  • ASP XML操作类代码

    2011-03-08 10:47:00
  • JS中getElementsByClassName与classList兼容性问题解决方案分析

    2023-08-25 05:39:06
  • Python中eval()函数的详细使用教程

    2023-11-22 15:51:39
  • asp关键词屏蔽过滤函数代码

    2010-05-04 16:32:00
  • Python的collections模块中的OrderedDict有序字典

    2023-06-21 00:13:52
  • 两个不太常用的 CSS Hack

    2008-06-27 12:49:00
  • 在Python中操作时间之mktime()方法的使用教程

    2023-02-07 11:38:58
  • 网页版面布局的处理问题

    2008-06-05 12:32:00
  • Python上下文管理器详细使用教程

    2021-06-24 05:47:35
  • 在应用环境中如何构造最优的数据库模式

    2009-04-01 14:28:00
  • Python 中的装饰器实现函数的缓存(场景分析)

    2022-07-30 01:37:08
  • python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择

    2022-04-22 01:39:50
  • Oracle误添加数据文件删除方法

    2009-07-02 12:21:00
  • SQL查询效率-100w数据查询只要1秒

    2008-08-20 18:25:00
  • asp之家 网络编程 m.aspxhome.com