文章目录

  • 顶点
  • 实现正二十面体

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().Tfig = px.scatter_3d(x=xs, y=ys, z=zs, size=np.ones_like(xs)*0.5)
fig.show()

得到顶点

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

def getDisMat(pts):N = len(pts)dMat = np.ones([N,N])*np.inffor i in range(N):for j in range(i):dMat[i,j] = np.linalg.norm([pts[i]-pts[j]])return dMatpts = 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()

效果如图所示

实现正二十面体

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

def isFace(e1, e2, e3):pts = np.vstack([e1, e2, e3])pts = np.unique(pts, axis=0)return len(pts)==3edges = [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绘制正二十面体相关推荐

  1. python中plotly绘制树地图_聚类分析python画树状图--Plotly(dendrogram)用法解析 - 人人都是架构师...

    1.前言 聚类分析是机器学习和数据分析中非常常见的分类方法, 当我们用到层次聚类(系统聚类)时,最常用的分析方法就是绘制树状图, 比较常见的统计软件像SPSS.SAS.R等都可以直接绘制树状图,比较简 ...

  2. python 画柱状图-python使用Plotly绘图工具绘制柱状图

    本文实例为大家分享了python使用Plotly绘图工具绘制柱状图的具体代码,供大家参考,具体内容如下 使用Plotly绘制基本的柱状图,需要用到的函数是graph_objs 中 Bar函数 通过参数 ...

  3. python绘制饼图-Python使用Plotly绘图工具,绘制饼图

    今天我们来学习一下如何使用Python的Plotly绘图工具,绘制饼图 使用Plotly绘制饼图的方法,我们需要使用graph_objs中的Pie函数 函数中最常用的两个属性values,用于赋值给需 ...

  4. python画直方图成绩分析-python plotly绘制直方图实例详解

    计算数值出现的次数 import cufflinks as cf cf.go_offline() import numpy as np import pandas as pd set_slippage ...

  5. python画直方图代码-Python使用Plotly绘图工具,绘制直方图

    今天我们再来讲解一下Python使用Plotly绘图工具如何绘制直方图 使用plotly绘制直方图需要用到graph_objs包中的Histogram函数 我们将数据赋值给函数中的x变量,x = da ...

  6. python绘制简单直方图-python plotly绘制直方图实例详解

    python plt怎么绘制直方图 # /usr/bin/python# -*- coding: utf-8 -*-import numpy as npfrom matplotlib import p ...

  7. Python使用Plotly绘图工具,绘制面积图

    今天我们来讲一下如何使用Python使用Plotly绘图工具,绘制面积图 绘制面积图与绘制散点图和折线图的画法类似,使用plotly graph_objs 中的Scatter函数,不同之处在于面积图对 ...

  8. python画直方图-python plotly绘制直方图实例详解

    计算数值出现的次数 import cufflinks as cf cf.go_offline() import numpy as np import pandas as pd set_slippage ...

  9. Python地理可视化:plotly绘制mapbox地图热力密度图

    Python地理可视化:plotly绘制mapbox地图热力密度图 import plotly.graph_objects as go import numpy as npKEYS = ['中心点经纬 ...

最新文章

  1. 上海python好找工作吗_上海找个月薪一万的工作难吗
  2. (转)Android 使用com.j256.ormlite
  3. APUE-文件和目录(二)函数access,mask,chmod和粘着位
  4. k8s之二进制安装etcd集群
  5. 操作系统实验报告14:Peterson 算法
  6. BZOJ 4916 神犇和蒟蒻
  7. 本地启动 SAP Commerce Cloud(Hybris) 产生的五个 Java 进程
  8. 初识斯蒂尔杰斯积分(Stieltjes integral)
  9. redis学习之redis的安装和简介
  10. Android Studio 2.0来啦
  11. html5移动端转盘,基于zepto适合移动端的幸运大转盘插件
  12. 【ArcGIS教程】专题图制作-地图渲染-地图整饰
  13. caffe 安装方法(python)
  14. 蓝牙音箱项目:记录CSR8635芯片的蓝牙音箱的开发过程
  15. C# 阿拉伯数字转换为中文数字/中文数字转换为阿拉伯数字
  16. app模式会被第三方平台模式取代吗_手机 App 不能取代第三方浏览器的原因是什么?...
  17. Python量化交易学习笔记(14)——均线交叉策略
  18. Unity3D 角度 弧度 向量
  19. 2023北京叶黄素展/北京视力矫正设备展/北京眼睛医学康复展
  20. 基于主从博弈的智能小区电动汽车充电管理及代理商定价策略

热门文章

  1. 个人站点网页设计html,响应式网页设计的快速教程(适合个人站点)
  2. 三维模型转换工具大全
  3. “吾道一以贯之”:华为Petal One的新格局
  4. 揭秘家用路由器0day漏洞挖掘技术原始环境搭建
  5. 服务器主板芯片和内存条兼容性,选购内存最大的坑:莫过于内存与主板的兼容性问题...
  6. 如果你一再做出错误的决定,很可能是认知出问题了
  7. 不懂应该怎么选合适的医疗器械进销存?
  8. SAP ABAP 数据填充进EXCEL模板或代码生成EXCEL并维护数据下载到本地
  9. PCI-E SSD、M2 SSD、SATA SSD测试
  10. 关于开放自动化的思考:模型,协议与算法