Python绘制Torus(环面)样式不符,如何调整至目标效果?
调整环面绘制代码以匹配目标样式
问题描述
我是Python新手,尝试绘制Torus(环面),希望达到扁平的环面样式,但当前代码绘制出的环面过高,与目标样式不符。以下是我的代码:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # Parameters for the torus R = 2 # Major radius r = 1 # Minor radius # Create a meshgrid for u (angle around the main circle) and v (angle around the tube) u = np.linspace(0, 2 * np.pi, 100) v = np.linspace(0, 2 * np.pi, 50) u, v = np.meshgrid(u, v) # Parametric equations for the torus x = (R + r * np.cos(v)) * np.cos(u) y = (R + r * np.cos(v)) * np.sin(u) z = r * np.sin(v) # Plotting fig = plt.figure(figsize=(8, 6)) ax = fig.add_subplot(111, projection='3d') # Torus surface ax.plot_surface(x, y, z, rstride=1, cstride=1, color='lightblue', edgecolor='gray', alpha=0.6) # Add lines of latitude (constant v, varying u) for j in np.linspace(0, 2*np.pi, 12): # meridians x_line = (R + r * np.cos(j)) * np.cos(u[0]) y_line = (R + r * np.cos(j)) * np.sin(u[0]) z_line = r * np.sin(j) * np.ones_like(u[0]) ax.plot(x_line, y_line, z_line, color='darkblue', linewidth=1) # Add lines of longitude (constant u, varying v) for i in np.linspace(0, 2*np.pi, 12): # parallels x_line = (R + r * np.cos(v[:, 0])) * np.cos(i) y_line = (R + r * np.cos(v[:, 0])) * np.sin(i) z_line = r * np.sin(v[:, 0]) ax.plot(x_line, y_line, z_line, color='darkred', linewidth=1) # Set aspect and remove axes ax.set_box_aspect([1, 1, 1]) ax.axis('off') plt.title("Torus with Parallels and Meridians") plt.show()
解决方案
核心修改点
- 调整环面参数比例:当前
r=1(管半径)相对R=2(主半径)过大,导致Z方向高度突出。将r减小为0.5,让管身更细,环面自然变得扁平。 - 优化3D视图角度:默认视图角度可能导致视觉上的比例偏差,添加
ax.view_init()调整仰角和方位角,让环面的扁平效果更直观。
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 调整环面参数:减小管半径r,让环面更扁平 R = 2 # 主半径 r = 0.5 # 管半径,从1改为0.5 # 创建网格 u = np.linspace(0, 2 * np.pi, 100) v = np.linspace(0, 2 * np.pi, 50) u, v = np.meshgrid(u, v) # 参数方程保持不变 x = (R + r * np.cos(v)) * np.cos(u) y = (R + r * np.cos(v)) * np.sin(u) z = r * np.sin(v) # 绘图设置 fig = plt.figure(figsize=(8, 6)) ax = fig.add_subplot(111, projection='3d') # 绘制环面 ax.plot_surface(x, y, z, rstride=1, cstride=1, color='lightblue', edgecolor='gray', alpha=0.6) # 添加纬线(恒定v,变化u) for j in np.linspace(0, 2*np.pi, 12): x_line = (R + r * np.cos(j)) * np.cos(u[0]) y_line = (R + r * np.cos(j)) * np.sin(u[0]) z_line = r * np.sin(j) * np.ones_like(u[0]) ax.plot(x_line, y_line, z_line, color='darkblue', linewidth=1) # 添加经线(恒定u,变化v) for i in np.linspace(0, 2*np.pi, 12): x_line = (R + r * np.cos(v[:, 0])) * np.cos(i) y_line = (R + r * np.cos(v[:, 0])) * np.sin(i) z_line = r * np.sin(v[:, 0]) ax.plot(x_line, y_line, z_line, color='darkred', linewidth=1) # 设置轴比例并调整视图角度,优化视觉效果 ax.set_box_aspect([1, 1, 1]) ax.view_init(elev=25, azim=40) # 调整仰角和方位角,让环面看起来更扁平 ax.axis('off') plt.title("Torus with Parallels and Meridians") plt.show()
效果说明
- 参数调整直接改变了环面的物理比例,Z方向的高度从原来的±1变为±0.5,完美匹配扁平的目标样式。
- 视图角度的调整避免了3D绘图中常见的视觉拉伸问题,让环面的比例呈现更准确。
内容的提问来源于stack exchange,提问作者GeMa 8906
相关产品推荐
相关产品推荐

