如何添加绕X轴旋转的旋转体(Solid of Revolution)子图并为各子图添加图例
如何添加绕X轴旋转的旋转体(Solid of Revolution)子图并为各子图添加图例
嘿,我来帮你搞定这个需求!咱们一步步修改你的代码,既添加绕X轴旋转的立体子图,又给每个子图配上清晰的图例,最终得到三个排列整齐的子图。
关键修改点说明
- 调整子图布局:把原来的1行2列改成1行3列,对应XY平面图、绕Y轴旋转体、绕X轴旋转体三个子图
- 计算绕X轴的旋转体:绕X轴旋转时,需要把Y轴方向的曲线以X轴为中心做圆周旋转,生成对应的三维坐标
- 添加图例:给每个绘图命令加上
label参数,再通过legend()方法把图例放在子图上方(避免遮挡图形)
修改后的完整代码
from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np n = 100 fig = plt.figure(figsize=(18, 6)) # 加宽画布,适配三个子图 # 1. XY平面的原始曲线子图 ax1 = fig.add_subplot(131) y = np.linspace(np.pi/8, np.pi*40/5, n) x = (y-2)**(1/3) # 目标函数 x=(y-2)^(1/3) # 绘图时添加label,用于图例 ax1.plot(x, y, label=r'$x=(y-2)^{1/3}$') # 把图例放在子图上方居中位置 ax1.legend(bbox_to_anchor=(0.5, 1.15), loc='center', borderaxespad=0) ax1.set_xlabel('X') ax1.set_ylabel('Y') ax1.set_title('XY平面曲线') # 2. 绕Y轴旋转的立体子图 ax2 = fig.add_subplot(132, projection='3d') t = np.linspace(0, np.pi*2, n) # 绕Y轴旋转:X-Z平面的圆周运动,Y值保持不变 xn = np.outer(x, np.cos(t)) zn = np.outer(x, np.sin(t)) yn = np.zeros_like(xn) for i in range(len(x)): yn[i:i+1, :] = np.full_like(yn[0, :], y[i]) # 绘制曲面并添加label ax2.plot_surface(xn, yn, zn, label='绕Y轴旋转体', alpha=0.7) # 3D图的图例位置调整 ax2.legend(bbox_to_anchor=(0.5, 1.15), loc='center', borderaxespad=0) ax2.set_xlabel('X') ax2.set_ylabel('Y') ax2.set_zlabel('Z') ax2.set_title('绕Y轴旋转的立体') # 3. 绕X轴旋转的立体子图 ax3 = fig.add_subplot(133, projection='3d') # 绕X轴旋转:Y-Z平面的圆周运动,X值保持不变 yn_rot = np.outer(y, np.cos(t)) zn_rot = np.outer(y, np.sin(t)) xn_rot = np.zeros_like(yn_rot) for i in range(len(x)): xn_rot[i:i+1, :] = np.full_like(xn_rot[0, :], x[i]) # 绘制曲面并添加label ax3.plot_surface(xn_rot, yn_rot, zn_rot, label='绕X轴旋转体', alpha=0.7, color='orange') # 添加图例 ax3.legend(bbox_to_anchor=(0.5, 1.15), loc='center', borderaxespad=0) ax3.set_xlabel('X') ax3.set_ylabel('Y') ax3.set_zlabel('Z') ax3.set_title('绕X轴旋转的立体') # 调整子图间距,避免重叠 plt.tight_layout() plt.show()
细节解释
- 画布尺寸调整:把
figsize从(12,6)改成(18,6),给三个子图足够的展示空间 - 图例位置:用
bbox_to_anchor=(0.5, 1.15)把图例定位在子图上方居中,不会遮挡曲线或立体图形 - 绕X轴旋转的计算逻辑:固定X坐标,让每个Y值绕X轴做圆周运动,生成对应的Y和Z坐标矩阵,这样就能得到绕X轴旋转的立体曲面
- 视觉区分:给绕X轴的立体曲面设置了橙色(
color='orange'),和绕Y轴的曲面做颜色区分,更易分辨
备注:内容来源于stack exchange,提问作者Freya the Goddess
相关产品推荐
相关产品推荐

