2013-08-12 43 views
8

Tôi đang cố tạo một chương trình tương tác chủ yếu sử dụng matplotlib để tạo các ô phân tán thay vì nhiều điểm (10k-100k hoặc hơn). Ngay bây giờ nó hoạt động, nhưng thay đổi mất quá nhiều thời gian để render. Một số lượng nhỏ các điểm là ok, nhưng một khi con số tăng lên thì mọi thứ trở nên bực mình. Vì vậy, tôi đang làm việc trên các cách để tăng tốc độ phân tán, nhưng tôi không có nhiều may mắnTăng tốc các ô phân tán matplotlib

Có cách rõ ràng để làm mọi thứ (cách nó được triển khai ngay bây giờ) (Tôi nhận ra âm mưu vẽ lại mà không cần cập nhật. không muốn thay đổi kết quả fps với các cuộc gọi lớn đến ngẫu nhiên).

import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib as mpl 
import time 


X = np.random.randn(10000) #x pos 
Y = np.random.randn(10000) #y pos 
C = np.random.random(10000) #will be color 
S = (1+np.random.randn(10000)**2)*3 #size 

#build the colors from a color map 
colors = mpl.cm.jet(C) 
#there are easier ways to do static alpha, but this allows 
#per point alpha later on. 
colors[:,3] = 0.1 

fig, ax = plt.subplots() 

fig.show() 
background = fig.canvas.copy_from_bbox(ax.bbox) 

#this makes the base collection 
coll = ax.scatter(X,Y,facecolor=colors, s=S, edgecolor='None',marker='D') 

fig.canvas.draw() 

sTime = time.time() 
for i in range(10): 
    print i 
    #don't change anything, but redraw the plot 
    ax.cla() 
    coll = ax.scatter(X,Y,facecolor=colors, s=S, edgecolor='None',marker='D') 
    fig.canvas.draw() 
print '%2.1f FPS'%((time.time()-sTime)/10) 

Mà cho một tốc độ 0,7 fps

Ngoài ra, tôi có thể chỉnh sửa các bộ sưu tập được trả về bởi phân tán. Đối với điều đó, tôi có thể thay đổi màu sắc và vị trí, nhưng không biết làm thế nào để thay đổi kích thước của mỗi điểm. Tôi nghĩ rằng tôi sẽ trông giống như thế này

import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib as mpl 
import time 


X = np.random.randn(10000) #x pos 
Y = np.random.randn(10000) #y pos 
C = np.random.random(10000) #will be color 
S = (1+np.random.randn(10000)**2)*3 #size 

#build the colors from a color map 
colors = mpl.cm.jet(C) 
#there are easier ways to do static alpha, but this allows 
#per point alpha later on. 
colors[:,3] = 0.1 

fig, ax = plt.subplots() 

fig.show() 
background = fig.canvas.copy_from_bbox(ax.bbox) 

#this makes the base collection 
coll = ax.scatter(X,Y,facecolor=colors, s=S, edgecolor='None', marker='D') 

fig.canvas.draw() 

sTime = time.time() 
for i in range(10): 
    print i 
    #don't change anything, but redraw the plot 
    coll.set_facecolors(colors) 
    coll.set_offsets(np.array([X,Y]).T) 
    #for starters lets not change anything! 
    fig.canvas.restore_region(background) 
    ax.draw_artist(coll) 
    fig.canvas.blit(ax.bbox) 
print '%2.1f FPS'%((time.time()-sTime)/10) 

Kết quả này sẽ chậm hơn 0,7 fps. Tôi muốn thử sử dụng CircleCollection hoặc RegularPolygonCollection, vì điều này sẽ cho phép tôi thay đổi kích thước dễ dàng và tôi không quan tâm đến việc thay đổi điểm đánh dấu. Nhưng, tôi không thể có được để vẽ vì vậy tôi không có ý tưởng nếu họ muốn được nhanh hơn. Vì vậy, tại thời điểm này tôi đang tìm kiếm ý tưởng.

+0

bạn đang sử dụng phiên bản nào? – tacaswell

+1

cũng thấy https://github.com/matplotlib/matplotlib/pull/2156 – tacaswell

+0

Python phiên bản 2.7.3, matplotlib 1.2.0 – george

Trả lời

4

Tôi đã trải qua điều này một vài lần cố gắng đẩy nhanh tiến độ điểm phân tán với số lượng lớn các điểm, khác nhau như cố gắng:

  • loại marker khác nhau
  • Hạn chế màu sắc
  • cắt xuống dataset
  • Sử dụng bản đồ nhiệt/lưới thay vì ô phân tán

Và không có thứ nào trong số này hoạt động. Matplotlib không phải là rất hiệu quả khi nói đến các mảnh phân tán. Đề xuất duy nhất của tôi là sử dụng một thư viện vẽ đồ thị khác, mặc dù tôi không tìm thấy cá nhân nào phù hợp. Tôi biết điều này không giúp được gì nhiều, nhưng nó có thể tiết kiệm cho bạn một số giờ mày mò.

+2

Tôi đã thực sự hy vọng rằng đó sẽ không phải là câu trả lời, matplotlib cực kỳ tiện lợi. Bất kỳ cơ hội bạn có thể đề cập đến một số thay thế matplotlib không phù hợp bạn đã cố gắng vì vậy tôi không thể dành thời gian tìm ra chúng sẽ không hoạt động? Ngay bây giờ đầu trong danh sách những thứ để thử là chaco. – george

+0

Tôi chỉ có một cặp vợ chồng, nhưng chúng tôi tiếp tục quay trở lại matplotlib vì nó là thuận tiện nhất và được hỗ trợ tốt. Cổng tiếp theo của tôi của cuộc gọi sẽ là rpy2 nếu tôi cần phải làm công cụ nhanh như câu hỏi của bạn - R được thiết kế cho dữ liệu lớn và sẽ giả định lô của họ là khá linh hoạt: http://rpy.sourceforge.net/rpy2/doc-2.2 /html/graphics.html – jozzas

+0

Tôi muốn đề xuất 2 tùy chọn cuối cùng. Nếu bạn chỉ muốn một bản trình bày trực quan đẹp mắt của một số mẫu, không có điểm vẽ toàn bộ nội dung. Một âm mưu phân tán mẫu phụ nên thường là OK.Hoặc bạn có thể lấy mẫu và hiển thị một số hình ảnh thô (và cũng có thể được làm nhẵn, tùy thuộc vào nhu cầu của bạn), thay đổi màu/cường độ để khớp với giá trị trong mỗi bin (hoặc "pixel"). Nó cho phép bạn giữ 'matplotlib' mà không phải chịu vấn đề quá lớn để giải quyết nó. –

4

Chúng tôi đang tích cực làm việc về hiệu suất cho các ô phân tán matplotlib lớn. Tôi khuyến khích bạn tham gia vào cuộc trò chuyện (http://matplotlib.1069221.n5.nabble.com/mpl-1-2-1-Speedup-code-by-removing-startswith-calls-and-some-for-loops-td41767.html) và, thậm chí tốt hơn, hãy kiểm tra yêu cầu kéo đã được gửi để cải thiện cuộc sống tốt hơn cho một trường hợp tương tự (https://github.com/matplotlib/matplotlib/pull/2156).

HTH

Các vấn đề liên quan