资讯动态

3D 参数曲面图实战:使用 plotly.py 的 Surface 绘制参数化曲面

发布时间:2026/9/21 16:43:45 来源:尧图企业网站定制
数据可视化数据分析【免费下载链接】plotly.pyThe interactive graphing library for Python :sparkles:项目地址https://gitcode.com/gh_mirrors/pl/plotly.py点击查看免费下载本指南基于 plotly.py 仓库中的 3D 参数化绘图文档doc/unconverted/python/3d-parametric-plots.md展开系统讲解如何利用go.Surface轨迹将数学参数方程如球坐标、柱坐标描述的曲面渲染为可交互的 3D 曲面图并深入剖析 colorscale、scene 三维坐标系等核心配置。读完本文你将能够独立完成从参数方程离散化到带配色与三维场景样式的交互式曲面图的完整实战闭环。什么是 3D 参数曲面图3D 参数曲面图是把由两个参数通常记作s、t或phi、theta定义的曲面x f(s, t) y g(s, t) z h(s, t)离散化为网格点再以网格点构成的多边形面片渲染出来的三维图形。与笛卡尔直角坐标系下的显式曲面z f(x, y)相比参数化描述能力更强——球面、环面、超环面torus knot 类曲面、莫比乌斯带等无法写成单值函数的曲面都可以用参数方程优雅表达。在 plotly.py 中这类图形由plotly.graph_objects.Surface即go.Surface轨迹负责渲染其数据组织方式是三个二维数组x、y、z维度一致且一一对应。基本参数曲面图以扰动球面为例文档给出的第一个例子是一个扰动球面以标准球坐标为基础把半径r替换为随参数波动的函数r 2 sin(7s 5t)从而在球面上形成起伏的褶皱。参数网格的构建先用numpy.linspace生成参数采样点再用numpy.meshgrid张成二维网格import numpy as np s np.linspace(0, 2 * np.pi, 240) # 经度方向参数采样 240 个点 t np.linspace(0, np.pi, 240) # 纬度方向参数采样 240 个点 tGrid, sGrid np.meshgrid(s, t) # 生成二维参数网格采样密度240 × 240直接决定曲面网格的细腻程度采样点越多曲面越光滑但前端渲染开销也越大对探索性可视化80 × 80到200 × 200通常是精度与性能的合理区间。代入参数方程计算坐标将球坐标公式应用到网格上r 2 np.sin(7 * sGrid 5 * tGrid) # r 2 sin(7s 5t) x r * np.cos(sGrid) * np.sin(tGrid) # x r*cos(s)*sin(t) y r * np.sin(sGrid) * np.sin(tGrid) # y r*sin(s)*sin(t) z r * np.cos(tGrid) # z r*cos(t)创建 Surface 轨迹与三维场景将三个坐标数组交给go.Surface再通过layout.scene配置三维场景中 x/y/z 三条轴的外观。文档示例中对三条轴统一设置了白网格线、浅灰背景并开启了坐标轴背景面板showbackgroundimport plotly.graph_objects as go surface go.Surface(xx, yy, zz) layout go.Layout( titleParametric Plot, scenedict( xaxisdict( gridcolorrgb(255, 255, 255), zerolinecolorrgb(255, 255, 255), showbackgroundTrue, backgroundcolorrgb(230, 230, 230) ), yaxisdict( gridcolorrgb(255, 255, 255), zerolinecolorrgb(255, 255, 255), showbackgroundTrue, backgroundcolorrgb(230, 230, 230) ), zaxisdict( gridcolorrgb(255, 255, 255), zerolinecolorrgb(255, 255, 255), showbackgroundTrue, backgroundcolorrgb(230, 230, 230) ) ) ) fig go.Figure(data[surface], layoutlayout) fig.show()关于文档中的旧版 API原始文档示例使用import plotly.plotly as py与py.iplot(fig, filenameParametric_plot)上传到 Plotly 在线服务展示这是早期的在线绘图工作流。当前仓库的plotly.py已采用plotly.graph_objects命名空间绘图统一通过fig.show()完成BaseFigure.show()实现默认走离线渲染器无需联网账号。本文所有示例均已按新 API 改写可直接运行。带 Colorscale 的参数曲面超环面公式与 Viridis 配色文档的第二个示例展示了如何为参数曲面添加颜色映射。它使用numpy.mgrid在球坐标两个方向上密集采样并把半径定义为一个由三角幂函数组合的超环面方程import numpy as np import plotly.graph_objects as go dphi, dtheta np.pi / 250.0, np.pi / 250.0 [phi, theta] np.mgrid[0:np.pi dphi * 1.5:dphi, 0:2 * np.pi dtheta * 1.5:dtheta] m0 4; m1 3; m2 2; m3 3; m4 6; m5 2; m6 6; m7 4 # 应用参数方程 r (np.sin(m0 * phi) ** m1 np.cos(m2 * phi) ** m3 np.sin(m4 * theta) ** m5 np.cos(m6 * theta) ** m7) x r * np.sin(phi) * np.cos(theta) y r * np.cos(phi) z r * np.sin(phi) * np.sin(theta) surface go.Surface(xx, yy, zz, colorscaleViridis) data [surface] layout go.Layout( titleAnother Parametric Plot, scenedict( xaxisdict(gridcolorrgb(255, 255, 255), zerolinecolorrgb(255, 255, 255), showbackgroundTrue, backgroundcolorrgb(230, 230, 230)), yaxisdict(gridcolorrgb(255, 255, 255), zerolinecolorrgb(255, 255, 255), showbackgroundTrue, backgroundcolorrgb(230, 230, 230)), zaxisdict(gridcolorrgb(255, 255, 255), zerolinecolorrgb(255, 255, 255), showbackgroundTrue, backgroundcolorrgb(230, 230, 230)) ) ) fig go.Figure(datadata, layoutlayout) fig.show()colorscale 的取值规则colorscale是Surface轨迹的核心外观属性。从 Surface 轨迹源码 的 docstring 可以确认它支持三种写法命名调色板字符串如Viridis、Plasma、Jet、Rainbow、Hot、Electric等。源码中列出的完整命名列表包括aggrnyl、agsunset、algae、amp、armyrose、balance、blackbody、bluered、blues、brbg、cividis、curl、deep、dense、earth、electric、greens、greys、hot、inferno、jet、magma、plasma、plotly3、portland、rainbow、rdbu、reds、spectral、sunset、turbo、twilight、viridis、ylgnbu、ylorrd等几十种且在命名后追加_r后缀即可反转色序如Viridis_r。列表形式[[0, green], [0.5, red], [1.0, rgb(0, 0, 255)]]这种归一化色阶值 颜色字符串的成对列表色阶值从 0 到 1至少需要 0 和 1 两个端点。plotly.colors 包中的调色板对象sequential、diverging、cyclical等模块见 _plotly_utils/colors 与 plotly/colors/init.py导出的列表可直接传入。颜色域控制cmin / cmax / cauto / reversescalecolorscale决定颜色怎么映射而颜色数值域则由一组配套属性控制同样定义于 Surface 轨迹源码cmin/cmax手动指定颜色域的下界与上界单位与z或surfacecolor一致二者需成对设置cauto是否根据数据自动计算颜色域一旦用户显式给出cmin/cmax默认即视为关闭自动计算cmid设定颜色域中点让cmin/cmax围绕该值等距缩放reversescale布尔值是否反转颜色映射方向autocolorscale布尔值决定是否使用默认调色板而非colorscale指定的调色板showscale布尔值控制是否显示右侧的颜色条colorbar默认开启colorbar颜色条本身的详细配置对象go.surface.ColorBar支持title、len、thickness、tickformat等子属性对应实现位于 plotly/graph_objs/surface/_colorbar.py。例如若要强制曲面颜色从 0 到 10 映射、并隐藏颜色条go.Surface(xx, yy, zz, colorscalePlasma, cmin0, cmax10, showscaleFalse)用 surfacecolor 独立驱动颜色Surface还提供surfacecolor属性它可以是一个与x/y/z同维的二维数组用于独立于几何高度之外的另一组标量来控制曲面着色。典型应用场景是几何是参数曲面、颜色表达物理量温度、压力、误差等。此时颜色域cmin/cmax/cauto依据的是surfacecolor而非z见源码 docstring 中对cauto的说明。三维场景scene的进阶配置所有 3D 轨迹包括Surface都在layout.scene这个三维场景子图中绘制。从 layout.scene 源码 可以看到场景支持的主要配置项xaxis/yaxis/zaxis三条轴各自的独立配置网格颜色gridcolor、零线颜色zerolinecolor、背景面板showbackground/backgroundcolor、范围range、刻度tickformat等aspectmode/aspectratio控制三维场景的宽高比模式如data按数据范围等比、cube强制立方体与手动比例camera相机视角eye、up、center等用于预设初始观察角度bgcolor场景背景色annotations三维空间中的文字标注domain场景在画布中的布局区域。文档示例中反复使用的白网格线 浅灰背景面板三轴统一配置正是为了让曲面在三维空间中层次清晰、便于旋转观察。相机视角可这样预设以 45° 俯视角度为例layout go.Layout( scenedict( xaxisdict(...), yaxisdict(...), zaxisdict(...), cameradict(eyedict(x1.5, y1.5, z1.2)), aspectmodedata ) )Surface 轨迹的常用属性速查结合 Surface 轨迹的完整属性清单参数曲面绘图中常用的属性归纳如下属性类型作用x/y/z二维数组曲面的三个坐标网格必须同维surfacecolor二维数组独立驱动着色的标量场可与高度不同colorscale字符串/列表配色方案命名调色板或色阶列表cmin/cmax/cmid数值颜色域边界与中点cauto/autocolorscale布尔颜色域 / 调色板是否自动确定reversescale布尔反转颜色映射showscale/colorbar布尔 / 对象颜色条显隐与外观opacity0~1 数值曲面透明度便于透视内部结构connectgaps布尔是否连接z中的 NaN 空洞contours对象曲面上叠加等高线x/y/z方向hidesurface布尔隐藏曲面本身配合contours可绘制线框效果lighting/lightposition对象光照与光源位置增强立体感hovertemplate字符串悬停信息模板如x: %{x}bry: %{y}brz: %{z}其中contours与hidesurface的组合特别适合参数曲面的线框模式将hidesurface设为True、同时开启contours.x.show/contours.y.show即可只绘制三维线框lighting则控制环境光、漫反射、镜面反射等参数能让曲面褶皱的立体感显著增强实现见 plotly/graph_objs/surface/_lighting.py。从参数方程到完整图形的完整流程把两个示例提炼成可复用的通用流程离散化参数域用np.linspace均匀采样或np.mgrid网格切片语法生成两个方向上的参数采样网格化用np.meshgrid将一维参数张成二维网格sGrid、tGrid代入参数方程基于网格计算x、y、z三个同维二维数组构造轨迹go.Surface(xx, yy, zz, colorscale...)配置场景在layout.scene中设置三轴样式、相机视角与宽高比组装与展示go.Figure(data[surface], layoutlayout)后调用fig.show()。参考与延伸本文主题文档doc/unconverted/python/3d-parametric-plots.mdSurface 轨迹完整属性与 colorscale 规则plotly/graph_objs/_surface.py三维场景 scene 配置plotly/graph_objs/layout/_scene.py颜色条与光照子组件plotly/graph_objs/surface/_colorbar.py、plotly/graph_objs/surface/_lighting.py内置调色板定义plotly/colors/init.py 与 _plotly_utils/colors若需绘制球坐标与极坐标风格的更多案例可参考仓库中的其他 3D 曲面文档如 3d-surface-plots.md 与 3d-mesh.md。赞分享数据可视化数据分析【免费下载链接】plotly.pyThe interactive graphing library for Python :sparkles:项目地址https://gitcode.com/gh_mirrors/pl/plotly.py点击查看免费下载相关推荐OpenMontage 中 ManimGL 三维曲面可视化实战参数化曲面、相机运镜与场景编排参考OpenMontage 中 ManimGL 三维曲面可视化实战参数化曲面、相机运镜与场景编排参考 导读 本篇文章解读 OpenMontage 仓库中数学动画技人工智能AI Agent音视频媒体生成工作流自动化Matplot 3D绘图指南从曲面到立体数据的可视化Matplot 3D绘图指南从曲面到立体数据的可视化 Matplot是一个强大的C图形库专为数据可视化设计。它为现代C应用程序提供了丰富的3数据可视化图表库three.js ParametricGeometry 全面指南用数学函数生成参数化曲面网格three.js ParametricGeometry 全面指南用数学函数生成参数化曲面网格 本文是 three.js 官方文档中 ParametricGeo前端3D渲染图形学上一篇Obsidian 表格增强插件 Table Enhancer 完整指南不碰源码像用 Excel 一样编辑表格下一篇Easy Vibe 数据治理导论从质量六维度、数据血缘到 ODS→ADS 分层数仓的完整方法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价