如何在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
相关产品推荐
相关产品推荐

