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

如何用Matplotlib将径向密度f(r)数据旋转生成3D曲面?

柱对称径向密度的3D曲面绘制方案

核心思路

柱对称的径向密度数据本质是极坐标下的一维数据,要转成3D笛卡尔坐标系的曲面,只需要把每个(x,y)点对应的径向距离r = sqrt(x² + y²)映射到对应的密度值f(r),再用Matplotlib绘制即可。

步骤与代码实现

  1. 导入依赖库
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
  1. 准备你的数据(替换成你实际的r和f(r)数组)
    这里用模拟数据做演示:
# 模拟径向距离r和对应的密度f(r)
r = np.linspace(0, 5, 20)  # 你的r数组
f_r = np.exp(-r**2/2) + 0.1*np.sin(r*3)  # 你的f(r)数组
  1. 生成笛卡尔坐标系的网格并计算对应的密度值
# 生成x和y的网格范围,根据你的r最大值调整
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)

# 计算每个网格点对应的径向距离R
R = np.sqrt(X**2 + Y**2)

# 用插值方法得到每个R对应的密度值Z(因为原r是离散点,网格点的R可能不在原数组里)
# interp1d支持线性插值,也可以指定'cubic'等插值方式
f_interp = interp1d(r, f_r, kind='linear', fill_value="extrapolate")
Z = f_interp(R)
  1. 绘制3D曲面
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# 绘制曲面,cmap设置颜色映射,rstride和cstride控制网格密度
surf = ax.plot_surface(X, Y, Z, cmap='viridis', rstride=2, cstride=2, alpha=0.8)

# 添加颜色条
fig.colorbar(surf, shrink=0.5, aspect=5)

# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Density f(r)')
ax.set_title('3D Surface of Cylindrically Symmetric Radial Density')

plt.show()

关键说明

  • 插值的必要性:如果你的原始r数组是均匀或非均匀的离散点,网格点的R大概率不在原始r列表中,所以需要用interp1d做插值,保证每个网格点都有对应的密度值。
  • 边界处理:fill_value="extrapolate"可以处理超出原始r范围的点(比如R大于r的最大值时),如果不需要外插,可以改成固定值或者去掉这个参数(超出范围会报错)。
  • 绘图样式:可以用plot_wireframe替换plot_surface得到线框风格的图,调整rstride和cstride可以改变曲面的精细程度。

内容的提问来源于stack exchange,提问作者magmar1968

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:02:12