Я пытаюсь создать интерактивную программу, которая в основном использует matplotlib для создания точечных диаграмм с большим количеством точек (10-100 тыс. или около того). Сейчас это работает, но изменения занимают слишком много времени. Небольшое количество очков — это нормально, но как только число увеличивается, все начинает быстро разочаровывать. Итак, я работаю над способами ускорения разброса, но мне не очень везет
Есть очевидный способ сделать это (то, как он реализован сейчас) (я понимаю, что сюжет перерисовывается без обновления. Я не хотел изменять результат fps с большими вызовами случайных).
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 )
Что дает быстрые 0,7 кадра в секунду
В качестве альтернативы я могу редактировать коллекцию, возвращаемую scatter. Для этого я могу изменить цвет и положение, но не знаю, как изменить размер каждой точки. Это, я думаю, выглядело бы примерно так
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 )
Это приводит к снижению скорости на 0,7 кадра в секунду. Я хотел попробовать использовать CircleCollection или RegularPolygonCollection, так как это позволило бы мне легко изменять размеры, и меня не волнует изменение маркера. Но я не могу заставить их рисовать, поэтому я понятия не имею, будут ли они быстрее. Итак, на данный момент я ищу идеи.