2017-07-26 132 views
2

我需要在一张图片中绘制许多球体,大小不一。以下代码有效,但需要很长时间才能运行。高效地绘制多个球体

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中有一个本地球体艺术家,我没有找到?

回答

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() 

enter image description here