2011-09-21 977 views
3

我有一個不斷變化的256x256 numpy數組數組。在每次迭代中,我都會拍攝一張快照來製作電影。快照是使用matplotlib製作的3d表面圖。如何提高python繪圖的速度?

問題是繪圖花費我> 2秒,每次迭代大約600秒250次迭代。我有相同的程序在MATLAB中運行,並且在迭代次數相同的情況下爲80-120秒。

問題:有沒有方法加快matplotlib 3d表面繪圖或有更快的python繪圖工具?

下面是一些代碼:

## initializing plot 

fig = plt.figure(111) 
fig.clf() 
ax = fig.gca(projection='3d') 
X = np.arange(0, field_size, 1) 
Y = np.arange(0, field_size, 1) 
X, Y = np.meshgrid(X, Y) 

## the loop 

start_time = time.time() 
for k in xrange(250): 
    it_time = time.time() 
    field[128,128] = maxvalue 
    field = scipy.ndimage.convolve(field, kernel) 
    print k, " calculation: ", time.time() - it_time, " seconds" 
    it_time = time.time() 
    ax.cla() 
    ax.plot_surface(X, Y, field.real, rstride=4, cstride=4, cmap=cm.hot, 
     linewidth=0, antialiased=False) 
    ax.set_zlim3d(-50, 150) 
    filename = "out_%d.png" % k 
    fig.savefig(filename) 
    #fig.clf() 
    print k, " plotting: ", time.time() - it_time, " seconds" 
print "computing: ", time.time() - start_time, " seconds" 

回答

0

GNUPLOT(訪問通過它的各種python interfaces)可能會更快。至少我在幾年前認識一個與你的問題類似的人,並且在測試了他們使用GNUplot的許多軟件包之後。雖然它看起來不像matplotlib。

此外,我假設您已關閉交互模式。

+0

謝謝,也許我會tru gnuplot。但交互模式如何影響速度? – Cubius

+0

在「交互模式」中,每個matplotlib命令都會重繪繪圖,因此速度較慢。你可以使用'plt.ioff()'關閉它。 – tom10

+0

好的,我試過gnuplot,速度更快,但我不得不花費一些時間來修補它 – Cubius

2

對於一般的3D繪圖,我會建議mayavi。起初它可能有點令人生畏,但它是值得的。

它肯定比matplotlib繪製三維數據的一個鏡頭要快得多。對於具有savefig通話繪製了很多次,我不知道......

0

我無法測試,如果它可以幫助,因爲你沒有提供一個可運行的例子,但是你可以看到,如果modifying the Poly3DCollection通過plot_surface返回更快比每次創建一個新的集合。

另外,您使用的是非交互式後端,對不對? (在導入pyplot之前調用matplotlib.use('agg')。)