You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Plotly(Python)在球面上绘制密度函数及梯度向量场?

球面上实值函数与梯度向量场的可视化方案

一、可视化球面上的实值函数$f(x,y,z)$

你可以通过将$f(x,y,z)$的计算值作为球面的颜色映射(surfacecolor参数),实现类似示例图的效果。具体步骤如下:

  1. 定义你的$f(x,y,z)$计算逻辑;
  2. 对每个球面点计算对应的$f$值;
  3. 绘制球面时,将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向量场,为避免图形过于密集,建议对原始网格降采样。具体步骤:

  1. 对球面坐标和梯度数据进行降采样;
  2. 使用go.Cone绘制每个采样点的梯度向量,配置向量大小、颜色等样式;
  3. 将向量场与球面叠加展示。

代码示例:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:15:34