मैं एक इंटरैक्टिव प्रोग्राम बनाने की कोशिश कर रहा हूं जो मुख्य रूप से मैटप्लॉटिब का उपयोग करता है ताकि कई बिंदुओं (10k-100k या so) के स्कैटर प्लॉट्स को बनाया जा सके। अभी यह काम करता है, लेकिन परिवर्तन प्रस्तुत करने में बहुत लंबा समय लगता है। अंक की छोटी संख्या ठीक है, लेकिन एक बार जब संख्या बढ़ जाती है तो जल्दी में चीजें निराशा होती हैं। तो, मैं स्कैटर को तेज करने के तरीकों पर काम कर रहा हूं, लेकिन मुझे बहुत भाग्य नहीं हैmatplotlib स्कैटर प्लॉट्स को तेज करना
चीज करने का स्पष्ट तरीका है (जिस तरह से इसे अभी लागू किया गया है) (मुझे साजिश के बिना प्लॉट रेड्रॉज का एहसास है। यादृच्छिक रूप से बड़ी कॉल के साथ एफपीएस परिणाम को बदलना नहीं चाहता था)।
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 एफपीएस, मैं संग्रह बिखराव द्वारा दिया संपादित कर सकते हैं। इसके लिए, मैं रंग और स्थिति बदल सकता हूं, लेकिन यह नहीं जानता कि प्रत्येक बिंदु के आकार को कैसे बदला जाए। मुझे लगता है कि यह
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 का उपयोग करने का प्रयास करना चाहता था, क्योंकि यह मुझे आसानी से आकार बदलने की अनुमति देगा, और मुझे मार्कर बदलने की परवाह नहीं है। लेकिन, मैं या तो आकर्षित नहीं कर सकता, इसलिए मुझे नहीं पता कि वे तेज़ होंगे या नहीं। तो, इस बिंदु पर मैं विचारों की तलाश में हूं।
आप किस संस्करण का उपयोग कर रहे हैं? – tacaswell
https://github.com/matplotlib/matplotlib/pull/2156 – tacaswell
पायथन संस्करण 2.7.3, matplotlib 1.2.0 – george