Python作图三维等高面

技术背景

对于等高线,大家都是比较熟悉的,因为日常生活中遇到的山体和水面,都可以用一系列的等高线描绘出来。而等高面,顾名思义,就是在三维空间“高度一致”的曲面。当然了,在二维平面上我们所谓的“高度”实际上就是第三个维度的值,但是三维曲面所谓的“高度”,实际上我们可以理解为密度。“高度”越高,“密度”越大。

等高线作图

如果是Python中画等高线,这个用Matplotlib就可以实现,这里就直接放一个Matplotlib的官方示例:

import matplotlib.pyplot as plt
import numpy as npplt.style.use('_mpl-gallery-nogrid')# make data
X, Y = np.meshgrid(np.linspace(-3, 3, 256), np.linspace(-3, 3, 256))
Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2)
levels = np.linspace(np.min(Z), np.max(Z), 7)# plot
fig, ax = plt.subplots()ax.contour(X, Y, Z, levels=levels)plt.show()

输出图像为:

其实关于Matplotlib还有一些可玩性更高的操作,比如画一个三维空间的断层扫描等高线:

实现的代码也是比较简单的:

# 该函数在z3维度做了断层
def plot3d(distribution, z1, z2, z3, z_level=[0, 5, 10, 15, 20, 25], levels=np.arange(0, 500, 50)):import matplotlib.pyplot as pltfig = plt.figure()ax = fig.add_subplot(111, projection='3d')idZ = np.array(z_level, np.int32)for idx in idZ:Z = z3[idx]g = ax.contourf(z1, z2, distribution[:, :, idx],zdir='z', offset=z3[idx], levels=levels)fig.colorbar(g, ax=ax)gap = (z3[idZ[-1]]-z3[idZ[0]])/10ax.set_zlim(z3[idZ[0]]-gap,z3[idZ[-1]]+gap)ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')plt.show()

但是因为画出来的图效果也是比较一般,而且速度并不是很快,因此关于这类问题,我还是比较推荐使用Plotly的登高面作图。

等高面作图

这里的数据没办法直接提供,有作图需求的童鞋可以自行准备数据。数据的维度为:z1->(m,),z2->(n,),z3->(p,),distribution->(m,n,p)。在作图函数的内部我们可以用一个meshgrid的操作对z1,z2,z3做展开,但是准备数据阶段我们就尽可能的简单就行了。这里直接上代码:

def iso_surface(distribution, z1, z2, z3, show=True, save_file=None, colorbar_min=0., colorbar_max=500.,opacity=0.4, surface_number=3):import ostry:import plotly.graph_objects as goimport plotly.offline as offlineexcept ImportError:# 确保plotly正常安装os.system('python3 -m pip install --upgrade plotly')import plotly.graph_objects as goimport plotly.offline as offline# Plotly作图要求数据展平,这里我们手动操作x, y, z = np.meshgrid(z1, z2, z3)distribution = distribution.reshape(-1)fig= go.Figure(data=go.Isosurface(x=x.reshape(-1),y=y.reshape(-1),z=z.reshape(-1),value=distribution,isomin=colorbar_min,isomax=colorbar_max,opacity=opacity,surface_count=surface_number))if save_file is not None:import plotly.io as piofmt = save_file.split('.')[-1]# Plotly支持的图片导出格式就是这几种了if fmt not in ['png', 'jpg', 'jpeg', 'webp', 'svg', 'pdf', 'eps']:raise ValueError("The format {} is not supported in plotly!".format(fmt))try:pio.write_image(fig, format=fmt, file=save_file)except ValueError:# 导出图片需要依赖kaleido环境os.system('python3 -m pip install --upgrade kaleido')pio.write_image(fig, format=fmt, file=save_file)# Plotly生成的结果是以html格式保存的,我们做了一个简单的本地备份if os.path.exists('offline_plot.html'):os.rename('offline_plot.html', 'offline_plot.html.bak')# 生成html文件以后选择是否需要打开,默认生成结束之后自动在浏览器打开图像if show:offline.plot(fig, filename='offline_plot.html', auto_open=True)else:offline.plot(fig, filename='offline_plot.html', auto_open=False)

为了复现起来容易一些,这里我自己通过添加异常捕获的方法,来确认环境配置问题。最终展示的结果为:

也可以换一个角度看:

这个数据用的跟前面章节展示的断层扫描图是同一个数据,在这个等高面结果中可以看到,三维空间中存在着一条低密度的“通路”。而且最关键的是,这个展示图像除了显示效果不错以外,速度也还是相当可观的,没有出现明显的卡顿。

总结概要

在一维空间下,我们要表示密度时可以给出一个二维的函数y=f(x),画出来是一条二维平面上的曲线。在二维空间下,我们要表示密度可以使用一个三维的函数z=f(x,y),画出来是一个三维空间的曲面。而三维空间下,密度表示是一个四维的函数:q=f(x,y,z),这个密度我们在三维空间已经没有办法用线或者面去表示,只能用体积元的颜色来表示。但是我们可以把这个密度投影到一个三维的等高曲面上,这个曲面就称为等高面。本文介绍了一个python中性能比较好的画等高面的工具:Plotly。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/iso-surface.html

作者ID:DechinPhy

更多原著文章:https://www.cnblogs.com/dechinphy/

请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

参考链接

  1. https://matplotlib.org/stable/plot_types/arrays/contour.html#sphx-glr-plot-types-arrays-contour-py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/710069.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据的崛起,Figma如何“活”下来并且四年增长将近100倍

随着互联网的蓬勃发展,数字化时代的到来,数据库规模在短短四年内增长了近100倍,这个数字足以让人们震惊和惊叹。而在这样一个激烈竞争的时代,如何让自己的产品在激烈的市场竞争中“活”下来成为了所有创业者和企业家们共同面对的问题。而Figma作为一个备受瞩目的在线协作设…

鸿蒙HarmonyOS实战-Stage模型(卡片数据交互)

🚀一、卡片数据交互 HarmonyOS卡片数据交互是指在基于鸿蒙操作系统的设备上,卡片界面之间进行数据的传输和交互。 HarmonyOS的卡片是一种轻量级的应用界面,可以在设备的屏幕上显示信息和提供操作功能。卡片可以包含各种类型的内容,如文本、图片、按钮、输入框等,并可以根…

CentOS7 图形界面\命令行启动切换(7.9)

1.关于/etc/inittab网上很多都说用着个配置 cat /etc/inittab大概意思就是说,这种设置方式已经不再使用2.建议使用systemctl用法systemctl get-default # multi-user.target #相当于init 3 # graphical.target #相当于init 6 #直接设置 systemctl set-default multi-user.ta…

LCA(最近公共祖先)

LCA 就是最近公共祖先,表示为 \(\operatorname{lca}(a, b)\),它的求解方法主要有两种。 倍增法 这是最常用的一种可以动态求 LCA 的算法。时间复杂度为 \(O(\log{n})\)。 中心思想 这个算法中有两个特殊的数组:\(depth[i]\) 和 \(fa[i][k]\)。 \(depth[i]\):\(i\) 点的深度…

CentOS7 图形界面管理(7.9)

1.关于/etc/inittab网上很多都说用着个配置 cat /etc/inittab大概意思就是说,这种设置方式已经不再使用2.建议使用systemctl用法systemctl get-default # multi-user.target #相当于init 3 # graphical.target #相当于init 6 #直接设置 systemctl set-default multi-user.ta…

vue2的混入mixin使用

前言 vue3中不再推荐使用mixins ! 在 Vue 2 中,mixins 是创建可重用组件逻辑的主要方式。尽管在 Vue 3 中保留了 mixins 支持,但对于组件间的逻辑复用,使用组合式 API 的组合式函数是现在更推荐的方式。 参考文档:https://juejin.cn/post/7033424132427481101 https://seg…

序列化与反序列化

引用DLL文件:Newtonsoft.Json.dll 路径:D:\yonyou\U9CE\Portal\bin\ C#实体类List<Departments> deptss = new List<Departments>();private void Department_Load(object sender, EventArgs e){strUri = TexURI.Text;strToken = GetToken(TexURI.Text);//Depart…

我的第一台电脑

这篇文章是对我的第一台电脑的回忆,大家感兴趣可以看看。【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18032053 出自【进步*于辰的博客】大家在看这篇文章的时候,可能会觉得我跑题了。当然,的确有些跑题。而…

Origin2022安装出现“试用期已结束”的解决方法

有小伙伴反馈,在安装Origin2022中文版出现弹窗:试用期已结束。…… 无法继续安装,这个问题该如何解决呢? origin 2022 中文版解决方法: 1、返回电脑桌面,点击左下角【Win标】按钮,在弹出列表中点击【设置】选项 2、点击【时间与语言】3、将【自动设置时间】点选关闭 …

中电金信:华安保险携手中电金信共研共建,重塑财险核心转型新范式

​引言 随着我国数字经济转型深入推进,保险业作为经济“减震器”和社会“稳定器”的作用愈发凸显,国家相继出台一系列发展规划和指导意见引导着保险业数字化转型走深向实。同时围绕人工智能、大数据、云计算等技术产品层出不穷,如智能语音客服、人脸识别、RPA等,推动保险运…

强大的效率工具:电脑桌面待办清单小工具

在这个快节奏的社会,每一分每一秒都显得弥足珍贵。上班族们每天都在与琐碎的工作任务、繁杂的日程计划打交道,如何提高工作效率,让每一天都充实而有条理呢?这时候,一款高效的待办清单工具就显得尤为重要。 那么有没有一款超强大的效率工具呢?电脑桌面待办清单小工具推荐哪…

Kubernetes 数据存储:从理论到实践的全面指南

本文深入解析 Kubernetes (K8S) 数据存储机制,探讨其架构、管理策略及最佳实践。文章详细介绍了 K8S 数据存储的基础、架构组成、存储卷管理技巧,并通过具体案例阐述如何高效、安全地管理数据存储,同时展望了未来技术趋势。关注【TechLeadCloud】,分享互联网架构、云服务技…