【问题标题】:draw many spheres efficiently有效地绘制许多球体
【发布时间】:2018-01-01 14:48:44
【问题描述】:

我需要在一张图片中绘制许多大大小小的球体。以下代码有效,但运行时间非常长。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_aspect('equal')

u = numpy.linspace(0, 2*numpy.pi, 100)
v = numpy.linspace(0, numpy.pi, 100)
x = numpy.outer(numpy.cos(u), numpy.sin(v))
y = numpy.outer(numpy.sin(u), numpy.sin(v))
z = numpy.outer(numpy.ones(numpy.size(u)), numpy.cos(v))

for k in range(200):
    c = numpy.random.rand(3)
    r = numpy.random.rand(1)
    ax.plot_surface(
        r*x + c[0], r*y + c[1], r*z + c[2],
        color='#1f77b4',
        alpha=0.5,
        linewidth=0
        )

plt.show()

我正在寻找更有效的解决方案。可能matplotlib中有我没找到的原生球体艺术家?

【问题讨论】:

    标签: python performance matplotlib 3d


    【解决方案1】:

    不,没有所谓的“球体艺术家”。即使有,也不会花费更少的时间来绘制它。

    您在问题中提出的解决方案是绘制许多球体的明智方法。但是,您可能需要考虑在球体上使用更少的点,

    u = numpy.linspace(0, 2*numpy.pi, 12)
    v = numpy.linspace(0, numpy.pi, 7)
    

    应该始终考虑的一个选项是不要使用 matplotlib 进行 3D 绘图,因为它是 not actually been designed for it;并改用Mayavi。 mayavi 中的上述内容看起来像

    from mayavi import mlab
    import numpy as np
    
    [phi,theta] = np.mgrid[0:2*np.pi:12j,0:np.pi:12j]
    x = np.cos(phi)*np.sin(theta)
    y = np.sin(phi)*np.sin(theta)
    z = np.cos(theta)
    
    def plot_sphere(p):
        r,a,b,c = p
        return mlab.mesh(r*x+a, r*y+b, r*z+c)  
    
    
    for k in range(200):
        c = np.random.rand(4)
        c[0] /= 10.
        plot_sphere(c)
    
    mlab.show()
    

    虽然计算需要类似的时间,但在 Mayavi 中交互式缩放或平移要快得多。

    此外,Mayavi 实际上提供了类似“球体艺术家”的东西,称为points3d

    from mayavi import mlab
    import numpy as np
    
    c = np.random.rand(200,3)
    r = np.random.rand(200)/10.
    
    mlab.points3d(c[:,0],c[:,1],c[:,2],r)
    
    mlab.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多