2017-03-07 30 views
-1

我想使用FigureCanvasQTAgg內的散點圖。散點圖可能有50,000個或更多的數據點。用戶想要在圖中繪製多邊形來選擇多邊形內的數據點。我已經意識到通過點擊鼠標設置點並使用Axis.plot()將它們與線連接起來。當用戶設置了多邊形的所有點時。每次添加一個新點時,我都會撥打FigureCanvasQTAgg.draw()來渲染當前版本的情節。這很慢,因爲散點圖有很多數據。 有沒有辦法讓這個更快?我如何使matplotlib繪圖更快地渲染

+0

您應該在散點圖中繪製數據點之前抽取數據點。如果抽取不可行,那麼您應該只顯示用戶想要繪製多邊形的區域。這應該會加快渲染速度。 – siavashk

+2

有關於[matplotlib「slow」](http://stackoverflow.com/search?q=%5Bmatplotlib%5D+「slow」)和354 [matplotlib「faster」]的409個問題(http://stackoverflow.com /查詢q =%5Bmatplotlib%5D + 「更快」)。他們都沒有幫助嗎?在這種情況下,更具體一點,告訴我們你已經嘗試了什麼,以及爲什麼它沒有幫助。 – ImportanceOfBeingErnest

+0

爲什麼你需要那麼多的數據點?這段代碼的最終目標是什麼? –

回答

0

兩個可能的解決方案:

  1. 不顯示的散點圖,但hexbin情節代替。
  2. 使用blitting。

(如果有人想知道這個答案的質量;介意提問specifially問這種結構的問題,下面的評論。)

+0

有趣的想法,但我確實有不止一種顏色。那怎麼樣:(我把它放在一個單獨的答案中) – Michael

0

我可以嘗試分散轉換使用matplotlib繪製圖像來渲染它並用imshow顯示圖像:

import matplotlib 
matplotlib.use('QT4AGG') 
import matplotlib.pyplot as plt 
import Image # PIL 
from io import BytesIO 
from matplotlib import image 

plt.scatter(xdata, ydata) 
plt.axis('off') 
plt.subplots_adjust(0, 0, 1, 1, 0, 0) 
stream = BytesIO() 
plt.savefig(stream, format='raw') 
pilImage = Image.fromstring('RGBA',size=(640, 480), data = stream.getvalue()) 
plt.imshow(image.pil_to_array(pilImage))