【问题标题】:How to plot multiple lines from a loop on one 3d plot in Python?如何在 Python 中的一个 3d 图上绘制循环中的多条线?
【发布时间】:2022-11-23 21:35:30
【问题描述】:

基本上,我在 Python 中循环生成光线,并试图将它们全部绘制在同一张图上。它们都应该在半径为 0.1 的圆上。每条射线都应位于圆上的某个位置,该位置随 arg 的变化而变化,在本例中为 theta。另外,只是提一下(虽然我不认为它是相关的)我在这里做 OOP。

我得到了正确的光线,但我无法在同一个 3d 图上得到它们,而且我不确定我应该怎么做。我以为使用 plt.show() 会给我一个包含所有 24 条射线的图表,但它只绘制了 24 个图表。 这是相关的代码供参考:

r = 0.1
arg = 0
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())
    fig = plt.figure()
    ax = plt.axes(projection='3d')
    #ax = fig.add_subplot(1,2,1,projection='3d')
    #plt.plot(points[:,2],points[:,0])
    ax.plot3D(points[:,0],points[:,1],points[:,2])
plt.show()

【问题讨论】:

  • 这是因为您调用了 figure() 24 次。摆脱循环。
  • 我试过了,现在它给我这样的错误: toolbar = getattr(self.figure.canvas, "toolbar") AttributeError: 'NoneType' 对象没有属性 'canvas'

标签: python matplotlib 3d raytracing


【解决方案1】:

扩展 Mercury 的评论,必须在循环外创建图形和 axes 对象。

import matplotlib.pyplot as plt
import numpy as np

r = 0.1
arg = 0

fig = plt.figure()
ax = plt.axes(projection='3d')
for i in range(0,24):
    arg += np.pi/12 * i
    v1 = r*np.sin(arg)
    v2 = r*np.cos(arg)
    # ...
    # using sample data
    x = []
    y = []
    z = []
    for j in range(2):
        x.append(j*v1)
        y.append(j*v2)
        z.append(j)
    # add vertex to the axes object
    ax.plot3D(x, y, z)
plt.show()

【讨论】:

  • 附加说明(与问题无关):我注意到您没有在循环内使用变量i(?)不知道其余代码就不确定,但也许循环中还缺少其他东西?
猜你喜欢
  • 2022-10-15
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多