2017-07-26 1 views
2

J'ai besoin de dessiner plusieurs sphères, petites et grandes, en une seule image. Le code suivant fonctionne, mais prend beaucoup de temps à courir.dessiner efficacement de nombreuses sphères

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

Je suis à la recherche d'une solution plus efficace. Peut-être qu'il y a un artiste de la sphère native dans matplotlib que je n'ai pas trouvé?

Répondre

1

Non, il n'y a pas d'artiste de la sphère. Et même s'il y en avait, cela ne prendrait pas moins de temps pour le dessiner.

La solution que vous présentez dans la question est un moyen judicieux de dessiner plusieurs sphères. Cependant, vous voudrez peut-être envisager d'utiliser beaucoup moins de points sur la sphère,

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

Une option, on doit toujours considérer est de ne pas utiliser matplotlib pour 3D tracé, comme il est not actually been designed for it; et utilisez Mayavi à la place. ci-dessus en mayavi ressemblerait

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

Alors que le calcul prend un temps similaire, le zoom de façon interactive ou panoramique est beaucoup plus rapide dans mâyâvi.

De plus mâyâvi fournit en fait quelque chose comme un "artiste de la sphère", qui est appelé 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