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

如何在matplotlib 3D投影中用contourf绘制环面截面等高线

3D环面及截面等高着色绘制方案

需求说明

需要绘制一个由自定义坐标转换函数生成的环面,具体要求:

  • 在同一张3D图中绘制0<φ<2π/3范围的环面曲面
  • 添加φ=0和φ=2π/3处的垂直截面,截面按VAL = (1 - RHO**2)**(3/2)进行等高着色

坐标转换函数

import numpy as np
import matplotlib.pyplot as plt

def flux2cart(RHO, PHI, THETA):
    # 可替换为你实际使用的常数参数
    R0, Z0 = 5.0, 0.0
    A0, DEL0, KSI0 = 1.0, 0.2, 0.1
    LAMBDA, DELTA, GAMMA = 0.5, 0.1, 0.05
    
    XX = (R0 + DEL0*(1.0-RHO**2) + RHO*A0*np.cos(THETA) - RHO*A0*DELTA*np.sin(THETA)**2)*np.cos(PHI)        
    YY = (R0 + DEL0*(1.0-RHO**2) + RHO*A0*np.cos(THETA) - RHO*A0*DELTA*np.sin(THETA)**2)*np.sin(PHI)
    ZZ = (Z0 + KSI0*(1.0-RHO**2) + RHO*A0*LAMBDA*np.sin(THETA) + RHO*A0*GAMMA*np.cos(THETA)**2)
    return XX, YY, ZZ

问题修正思路

你之前用ax.contourf(np.sqrt(x**2+y**2), z, val, ...)的方式错误,3D轴中的contourf需要直接使用截面的三维坐标(X,Y,Z)定位,无需转换为柱坐标的R和Z。

完整实现代码

# 创建3D绘图对象
fig, ax = plt.subplots(subplot_kw={"projection": "3d"}, figsize=(12, 10))

# ---------------------- 绘制环面曲面 ----------------------
rho_surface = 1.0
phi_range = np.linspace(0, 2*np.pi/3, 101)
theta = np.linspace(0., 2.*np.pi, 101)
PHI_surf, THETA_surf = np.meshgrid(phi_range, theta)
XX_surf, YY_surf, ZZ_surf = flux2cart(rho_surface, PHI_surf, THETA_surf)
ax.plot_surface(XX_surf, YY_surf, ZZ_surf, color='lightblue', alpha=0.7)

# ---------------------- 绘制φ=0处的截面 ----------------------
# 生成截面网格:RHO从0到1,THETA从0到2π
rho_section = np.linspace(0., 1., 101)
theta_section = np.linspace(0., 2.*np.pi, 101)
RHO0, THETA0 = np.meshgrid(rho_section, theta_section)
# 计算截面的三维坐标(φ固定为0)
XX0, YY0, ZZ0 = flux2cart(RHO0, 0., THETA0)
# 计算着色值VAL
VAL0 = (1 - RHO0**2)**(3/2)
# 在3D轴中绘制截面的等高着色
contour0 = ax.contourf(XX0, YY0, ZZ0, VAL0, levels=25, cmap='rainbow', alpha=0.9)

# ---------------------- 绘制φ=2π/3处的截面 ----------------------
RHO1, THETA1 = np.meshgrid(rho_section, theta_section)
XX1, YY1, ZZ1 = flux2cart(RHO1, 2*np.pi/3, THETA1)
VAL1 = (1 - RHO1**2)**(3/2)
contour1 = ax.contourf(XX1, YY1, ZZ1, VAL1, levels=25, cmap='rainbow', alpha=0.9)

# 添加颜色条
fig.colorbar(contour0, ax=ax, shrink=0.6, label='VAL')

# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('Toroidal Surface with Colored Cross-Sections')

plt.show()

关键说明

  • 截面绘制时,直接用flux2cart生成固定φ值的三维坐标网格,确保截面与环面位置完全匹配
  • ax.contourf前三个参数为截面的X/Y/Z坐标,第四个参数为着色用的VAL值,可精准渲染截面的等高效果
  • 通过alpha参数调整曲面和截面的透明度,避免相互遮挡

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:26:20