PyVista绘制Hopf环面如何按到原点的距离自定义表面着色
实现方法
核心逻辑
你之前的方案出错是因为直接绑定三维坐标数组作为标量,PyVista无法自动识别为到原点的距离,只需要显式计算所有网格点到原点的欧氏距离作为自定义标量绑定到网格,就可以完全自主控制颜色映射规则。
完整可运行代码
import pyvista as pv import numpy as np from matplotlib.colors import LogNorm # ---------------------- 生成Hopf环面网格 ---------------------- n_sampling = 200 u = np.linspace(0, 2*np.pi, n_sampling) v = np.linspace(0, 2*np.pi, n_sampling) U, V = np.meshgrid(u, v) # Hopf映射坐标生成,可根据自己的环面参数调整 R = 2 # 环面中心到管中心的距离 r = 1 # 环面管半径 x = (R + r*np.cos(V)) * np.cos(U) y = (R + r*np.cos(V)) * np.sin(U) z = r * np.sin(V) grid = pv.StructuredGrid(x, y, z) # ---------------------- 自定义着色标量 ---------------------- # 显式计算每个点到原点的欧氏距离,绑定为网格的标量字段 grid['distance_to_origin'] = np.linalg.norm(grid.points, axis=1) # ---------------------- 自定义颜色映射绘制 ---------------------- plotter = pv.Plotter() plotter.add_mesh( grid, cmap='viridis', # 支持所有matplotlib内置色卡,也可传入自定义Colormap对象 # clim=(1, 3), # 手动指定颜色映射的数值范围,不填默认用标量的最小/最大值 # norm=LogNorm(vmin=1, vmax=4), # 需非线性映射时传入对应归一化对象即可 scalar_bar_args={'title': '到原点的距离', 'vertical': True} # 自定义标量条属性 ) plotter.show_axes() plotter.show()
自定义颜色映射的常用控制方式
- 调整颜色映射数值范围:修改
clim参数,传入你需要的最小/最大映射值即可,超出范围的数值会自动取色卡两端的极值颜色 - 自定义色阶:
cmap参数支持所有matplotlib内置色卡名称,也可以直接传入自定义的matplotlib.colors.Colormap实例实现完全自定义的色阶 - 非线性映射:如果需要对数、分段等非线性映射规则,直接构造
matplotlib.colors.Normalize的对应子类实例传给norm参数即可 - 调整标量条样式:通过
scalar_bar_args参数可以自定义标量条的标题、位置、方向、刻度等所有属性
内容的提问来源于stack exchange,提问作者Stéphane Laurent
相关产品推荐
相关产品推荐

