如何用Plotly(Python)在球面上绘制密度函数及梯度向量场?
球面上实值函数与梯度向量场的可视化方案
一、可视化球面上的实值函数$f(x,y,z)$
你可以通过将$f(x,y,z)$的计算值作为球面的颜色映射(surfacecolor参数),实现类似示例图的效果。具体步骤如下:
- 定义你的$f(x,y,z)$计算逻辑;
- 对每个球面点计算对应的$f$值;
- 绘制球面时,将
surfacecolor设置为$f$值数组,搭配颜色条增强可读性。
修改后的代码示例:
import plotly.graph_objects as go import numpy as np # 自定义标题 title = "球面上的实值函数可视化" fig = go.Figure(layout=go.Layout(title=go.layout.Title(text=title), hovermode=False)) # 生成球面坐标网格 phi, theta = np.mgrid[0.0:np.pi:100j, 0.0:2.0 * np.pi:100j] x = np.sin(phi) * np.cos(theta) y = np.sin(phi) * np.sin(theta) z = np.cos(phi) # --- 关键:计算每个点的f值 --- # 替换成你实际的f(x,y,z)计算逻辑,示例为f = x + y + z def compute_f(x_coords, y_coords, z_coords): return x_coords + y_coords + z_coords f_vals = compute_f(x, y, z) # 绘制带颜色映射的球面 fig.add_surface( x=x, y=y, z=z, surfacecolor=f_vals, # 用f值控制颜色 opacity=0.7, # 调整透明度以便观察 colorbar=dict(title="f(x,y,z)值"), # 添加颜色条 cmin=f_vals.min(), cmax=f_vals.max() # 设置颜色范围 ) fig.show()
二、绘制球面上的梯度向量场
可以用Plotly的go.Cone组件绘制3D向量场,为避免图形过于密集,建议对原始网格降采样。具体步骤:
- 对球面坐标和梯度数据进行降采样;
- 使用
go.Cone绘制每个采样点的梯度向量,配置向量大小、颜色等样式; - 将向量场与球面叠加展示。
代码示例:
import plotly.graph_objects as go import numpy as np title = "球面上的梯度向量场可视化" fig = go.Figure(layout=go.Layout(title=go.layout.Title(text=title), hovermode=False)) # 生成原始球面坐标网格 phi, theta = np.mgrid[0.0:np.pi:100j, 0.0:2.0 * np.pi:100j] x = np.sin(phi) * np.cos(theta) y = np.sin(phi) * np.sin(theta) z = np.cos(phi) # --- 替换为你实际的梯度计算逻辑 --- # 示例:假设f = x + y + z,梯度为(1,1,1),实际需替换为你的闭式梯度计算 def compute_gradient(x_coords, y_coords, z_coords): dx = np.ones_like(x_coords) # 梯度x分量 dy = np.ones_like(y_coords) # 梯度y分量 dz = np.ones_like(z_coords) # 梯度z分量 return dx, dy, dz dx, dy, dz = compute_gradient(x, y, z) # --- 降采样:减少向量数量,避免图形拥挤 --- sample_step = 10 # 每10个点取一个 x_sample = x[::sample_step, ::sample_step] y_sample = y[::sample_step, ::sample_step] z_sample = z[::sample_step, ::sample_step] dx_sample = dx[::sample_step, ::sample_step] dy_sample = dy[::sample_step, ::sample_step] dz_sample = dz[::sample_step, ::sample_step] # 绘制基础球面 fig.add_surface(x=x, y=y, z=z, opacity=0.35, showscale=False) # 绘制梯度向量场(锥形体表示向量) fig.add_trace(go.Cone( x=x_sample.flatten(), y=y_sample.flatten(), z=z_sample.flatten(), u=dx_sample.flatten(), v=dy_sample.flatten(), w=dz_sample.flatten(), colorscale='Viridis', colorbar=dict(title="梯度幅值"), sizemode="absolute", sizeref=0.1, # 调整向量大小 showscale=True )) fig.show()
注意:如果你的梯度是球面上的切向量,建议将其投影到球面切平面(减去径向分量:grad_proj = grad - (grad · r)*r,其中r是球面点的单位向量),避免向量指向球面外部。
内容的提问来源于stack exchange,提问作者nullgeppetto
相关产品推荐
相关产品推荐

