我正在尝试制作一个交互式程序,主要使用matplotlib制作相当多的点(大约10k-100k)。目前虽然可以工作,但更改渲染时间太长。小数量的点还好,但一旦数量增加,事情就会变得令人沮丧。因此,我正在寻找加速绘制散点图的方法,但运气不太好。
目前实现方式是很明显的方式(像现在这样实现)(我知道绘图重新绘制而不更新。我不想通过大量调用随机函数来改变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,因为这样可以轻松更改大小,而且我不关心更改标记。但是,我无法绘制任何一个,所以我不知道它们是否会更快。所以,在这一点上,我正在寻找想法。