2017-07-26 92 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