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.
bạn đang sử dụng phiên bản nào? – tacaswell
cũng thấy https://github.com/matplotlib/matplotlib/pull/2156 – tacaswell
Python phiên bản 2.7.3, matplotlib 1.2.0 – george