2017-07-26 12 views
2

私は、1つの画像に多くの球を小さく、大きく描画する必要があります。次のコードは機能しますが、実行には時間がかかります。多くの球を効率的に描画する

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

いいえ、「球体アーティスト」のようなものはありません。そして、それがあったとしても、それを描く時間はそれほど長くはありません。

あなたが問題に提示する解決策は、多くの球を描くための賢明な方法です。ただし、1つは、常に検討すべきオプションは、それがnot actually been designed for itであるように、3Dプロットのためのmatplotlibのを使用するのではない

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

、球面上のはるかに少ないポイントを使用して検討する必要があります。代わりにMayaviを使用してください。計算がインタラクティブにズームやパンがはるかに高速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が実際に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

と呼ばれる "球アーティスト"、のようなものを提供します