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

目录
  • 顶点
  • 实现正二十面体

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

得到顶点

接下来连接这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()

效果如图所示

实现正二十面体

接下来要对面上色。由于三棱成个面,所以只需得到所有三条棱的组合,只要这三条棱可以组成三角形,就能获取所有的三角面。当然,这一切的前提是,正二十面体只有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绘制正二十面体详解的详细内容,更多关于Python plotly绘制正二十面体的资料请关注我们其它相关文章!

(0)

相关推荐

  • python使用Plotly绘图工具绘制水平条形图

    本文实例为大家分享了python绘制水平条形图的具体代码,供大家参考,具体内容如下 水平条形图与绘制柱状图类似,大家可以先看看我之前写的博客,如何绘制柱状图 水平条形图需要在Bar函数中设置orientation= 'h' 其他的参数与柱状图相同.也可以通过设置barmode = 'stack', 绘制层叠水平条形图和瀑布式水平条形图 import plotly as py import plotly.graph_objs as go pyplt = py.offline.plot data =

  • python使用Plotly绘图工具绘制气泡图

    今天来讲讲如何使用Python 绘图工具,Plotly来绘制气泡图. 气泡图的实现方法类似散点图的实现.修改散点图中点的大小,就变成气泡图. 实现代码如下: import plotly as py import plotly.graph_objs as go pyplt = py.offline.plot trace0 = go.Scatter( x=[1, 2, 3, 4, 5, 6, 7], y=[8, 10, 12, 14, 16, 18, 20], mode='markers', mar

  • Python绘制正二十面体图形示例

    目录 正二十面体的顶点 绘制棱 绘制面 总结 正二十面体的顶点 正20面体的12个顶点刚好可以分为三组,每一组都是一个符合黄金分割比例的长方形,而且这三个长方形是互相正交的. 所以,想绘制一个正二十面体是比较容易的 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 =

  • python使用Plotly绘图工具绘制柱状图

    本文实例为大家分享了python使用Plotly绘图工具绘制柱状图的具体代码,供大家参考,具体内容如下 使用Plotly绘制基本的柱状图,需要用到的函数是graph_objs 中 Bar函数 通过参数,可以设置柱状图的样式. 通过barmod进行设置可以绘制出不同类型的柱状图出来. 我们先来实现一个简单的柱状图: # -*- coding: utf-8 -*- import plotly as py import plotly.graph_objs as go pyplt = py.offlin

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

    目录 顶点 棱 实现正二十面体 plotly 的 Python 软件包是一个开源的代码库,它基于 plot.js,而后者基于 d3.js.我们实际使用的则是一个对 plotly 进行封装的库,名叫 cufflinks,能让你更方便地使用 plotly 和 Pandas 数据表协同工作. 一言以蔽之,plotly是一款擅长交互的Python绘图库,下面就初步使用一下这个库的三维绘图功能.此前曾经用matplotlib画了正二十面体和足球:Python绘制正二十面体:画足球,这次用plotly复现一

  • Python利用Matplotlib绘制图表详解

    目录 前言 折线图绘制与显示 绘制数学函数图像 散点图绘制 绘制柱状图 绘制直方图 饼图 前言 Matplotlib 是 Python 中类似 MATLAB 的绘图工具,如果您熟悉 MATLAB,那么可以很快的熟悉它. Matplotlib 提供了一套面向对象绘图的 API,它可以轻松地配合 Python GUI 工具包(比如 PyQt,WxPython.Tkinter)在应用程序中嵌入图形.与此同时,它也支持以脚本的形式在 Python.IPython Shell.Jupyter Notebo

  • Python matplotlib plotly绘制图表详解

    目录 一.整理数据 二.折线图 三.散点图 四.饼图 五.柱形图 六.点图(设置多个go对象) 七.2D密度图 八.简单3D图 一.整理数据 以300部电影作为数据源 import pandas as pd cnboo=pd.read_excel("cnboNPPD1.xls") cnboo import seaborn as sns import numpy as np import matplotlib as mpl from matplotlib import pyplot as

  • Python利用Flask-Mail实现发送邮件详解

    目录 前言 qq邮箱开启smtp服务 Flask-Mail的安装 Flask-MailQQ邮箱的配置 Flask-Mail的使用 前言 在开发过程中,很多应用程序都需要通过邮件提醒用户, Flask 的扩展包 Flask - Mail 通过包装了 Python 内置的smtplib包,可以用在 Flask 程序中发送邮件.Flask - Mail 连接到简单邮件协议( Simple Mail Transfer Protocol , SMTP )服务器,并把邮件交给服务器发送! qq邮箱开启smt

  • 利用Python计算KS的实例详解

    在金融领域中,我们的y值和预测得到的违约概率刚好是两个分布未知的两个分布.好的信用风控模型一般从准确性.稳定性和可解释性来评估模型. 一般来说.好人样本的分布同坏人样本的分布应该是有很大不同的,KS正好是有效性指标中的区分能力指标:KS用于模型风险区分能力进行评估,KS指标衡量的是好坏样本累计分布之间的差值. 好坏样本累计差异越大,KS指标越大,那么模型的风险区分能力越强. 1.crosstab实现,计算ks的核心就是好坏人的累积概率分布,我们采用pandas.crosstab函数来计算累积概率

  • 如何利用Python识别图片中的文字详解

    一.Tesseract 文字识别是ORC的一部分内容,ORC的意思是光学字符识别,通俗讲就是文字识别.Tesseract是一个用于文字识别的工具,我们结合Python使用可以很快的实现文字识别.但是在此之前我们需要完成一个繁琐的工作. (1)Tesseract的安装及配置 Tesseract的安装我们可以移步到该网址 https://digi.bib.uni-mannheim.de/tesseract/,我们可以看到如下界面: 有很多版本供大家选择,大家可以根据自己的需求选择.其中w32表示32

  • Python matplotlib 绘制散点图详解建议收藏

    目录 前言 1. 散点图概述 什么是散点图? 散点图使用场景 绘制散点图步骤 案例展示  2. 散点图属性 设置散点大小 设置散点颜色 设置散点样式 设置透明度 设置散点边框 3. 添加折线散点图 4. 多类型散点图 5. 颜色条散点图 6. 曲线散点图 总结 前言 我们在matplotlib模块学习中,发现有常用的反映数据变化的折线图,对比数据类型差异的柱状图和反应数据频率分布情况的直方图. 其实在数据统计图表中,有一种图表是散列点分布在坐标中,反应数据随着自变量变化的趋势. 本期,我们将详细

  • Python pyecharts绘制条形图详解

    目录 一.简介 二.整理数据 1.配置主题 2.柱状图 Bar - Bar_base_dict_config 3.样例数据 Faker.choose() 4.滚动条 Bar - Bar_datazoom_slider 5.鼠标移动效果 Bar - Bar_datazoom_inside 6.显示最值 Bar - Bar_markpoint_type 7.改变滚动条在侧面 Bar - Bar_datazoom_slider_vertical 8.多个Y轴 9.直方图 Bar - Bar_histo

  • Python matplotlib 绘制散点图详解建议收藏

    目录 前言 1. 散点图概述 什么是散点图? 散点图使用场景 绘制散点图步骤 案例展示  2. 散点图属性 设置散点大小 设置散点颜色 设置散点样式 设置透明度 设置散点边框 3. 添加折线散点图 4. 多类型散点图 5. 颜色条散点图 6. 曲线散点图 总结 前言 我们在matplotlib模块学习中,发现有常用的反映数据变化的折线图,对比数据类型差异的柱状图和反应数据频率分布情况的直方图. 往期内容速看 Python用 matplotlib 绘制柱状图 Python matplotlib底层

  • 利用Python实现面部识别的方法详解

    人脸识别正在成为软件开发中的一种趋势.它有助于识别人脸并使应用程序更加健壮.在本教程中,我们将使用python和face_recognition库创建一个简单的人脸识别. 对于开发环境,我们将使用 Visual Studio Community Edition. 如果你的计算机上还没有安装它,你可以从这里下载.并使用 C++安装桌面开发. 现在我们有了使用 C++ 进行桌面开发的 Visual Studio,我们可以开始我们的项目了. 使用 Visual Studio 打开一个新目录并创建一个新

随机推荐