如何在单个3D图中绘制循环生成的多条光线
解决Matplotlib循环绘制多光线生成多张图的问题
你当前代码每次循环都会创建新的画布(plt.figure())和3D轴(plt.axes(projection='3d')),所以每条光线都被画在独立的图里。要把所有光线放在同一张图里,只需要把创建画布和轴的代码移到循环外面,循环内只执行绘制操作即可。
修改后的完整代码:
import numpy as np import matplotlib.pyplot as plt # 假设你的ray模块已正确导入 import ray r = 0.1 arg = 0 # 先创建一次画布和3D轴,放在循环外面 fig = plt.figure() ax = plt.axes(projection='3d') for i in range(0,24): arg += np.pi/12 x = r*np.sin(arg) y = r*np.cos(arg) l = ray.Ray(r=np.array([x,y,0]),v=np.array([0.5,0,5])) c = ray.SphericalRefraction(z0 = 100, curv = 0.0009, n1 = 1.0, n2 = 1.5, ar = 5) c.propagate_ray(l) o = ray.OutputPlane(250) o.outputintercept(l) points = np.array(l.vertices()) # 直接在已创建的ax上绘制当前光线 ax.plot3D(points[:,0],points[:,1],points[:,2]) # 最后统一显示图 plt.show()
关键改动说明:
- 将
fig = plt.figure()和ax = plt.axes(projection='3d')移到for循环之前,确保整个循环共用同一个画布和3D坐标轴 - 循环内仅保留
ax.plot3D(...)的绘制逻辑,每条光线都会叠加到同一个轴上 - 把
plt.show()放在循环结束后,一次性显示包含所有光线的图
内容的提问来源于stack exchange,提问作者hinkog
相关产品推荐
相关产品推荐

