2013-08-12 9 views
8

मैं एक इंटरैक्टिव प्रोग्राम बनाने की कोशिश कर रहा हूं जो मुख्य रूप से मैटप्लॉटिब का उपयोग करता है ताकि कई बिंदुओं (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 का उपयोग करने का प्रयास करना चाहता था, क्योंकि यह मुझे आसानी से आकार बदलने की अनुमति देगा, और मुझे मार्कर बदलने की परवाह नहीं है। लेकिन, मैं या तो आकर्षित नहीं कर सकता, इसलिए मुझे नहीं पता कि वे तेज़ होंगे या नहीं। तो, इस बिंदु पर मैं विचारों की तलाश में हूं।

+0

आप किस संस्करण का उपयोग कर रहे हैं? – tacaswell

+1

https://github.com/matplotlib/matplotlib/pull/2156 – tacaswell

+0

पायथन संस्करण 2.7.3, matplotlib 1.2.0 – george

उत्तर

4

मैं इस के माध्यम से अंक की बड़ी संख्या के साथ बिखराव भूखंडों में तेजी लाने की कोशिश कर कई बार किया गया है, विभिन्न कोशिश कर:

  • अलग मार्कर प्रकार
  • सीमित रंग
  • डाटासेट
  • नीचे काटना
  • एक हीटमैप/ग्रिड के बजाय एक बिखराव साजिश

और इन बातों में से कोई भी का उपयोग करते हुए काम किया। स्कैटर प्लॉट की बात आती है जब Matplotlib बस बहुत ही प्रदर्शनकारी नहीं है। मेरी एकमात्र सिफारिश एक अलग साजिश पुस्तकालय का उपयोग करना है, हालांकि मुझे व्यक्तिगत रूप से उपयुक्त नहीं मिला है। मुझे पता है कि इससे ज्यादा मदद नहीं मिलती है, लेकिन यह आपको कुछ घंटे के फलहीन टिंचरिंग बचा सकती है।

+2

मैं वास्तव में उम्मीद कर रहा था कि उत्तर नहीं होगा, matplotlib बेहद सुविधाजनक है। किसी भी मौके पर आप कुछ गैर-उपयुक्त matplotlib प्रतिस्थापन का उल्लेख कर सकते हैं जिन्हें आपने कोशिश की है, इसलिए मैं यह जानने में समय नहीं लगा सकता कि वे काम नहीं करेंगे? कोशिश करने के लिए चीजों की मेरी सूची पर अभी शीर्ष पर चको है। – george

+0

मैं केवल एक जोड़े के साथ फूट गया, लेकिन हम matplotlib पर वापस गिरते रहे क्योंकि यह सबसे सुविधाजनक और अच्छी तरह से समर्थित है। मेरा अगला बंदरगाह कॉल rpy2 होगा यदि मुझे आपके प्रश्न की तरह तेज़ सामान करने की ज़रूरत है - आर को बड़े डेटा के लिए डिज़ाइन किया गया है और कोई यह मान लेगा कि उनके भूखंड काफी हद तक चंचल हैं: http://rpy.sourceforge.net/rpy2/doc-2.2 /html/graphics.html – jozzas

+0

मैं पिछले 2 विकल्पों की अनुशंसा करता हूं। यदि आप बस कुछ नमूने की एक अच्छी दृश्य प्रस्तुति चाहते हैं, तो पूरी बात को साकार करने का कोई मतलब नहीं है। एक सबसमूह स्कैटर प्लॉट आमतौर पर ठीक होना चाहिए।वैकल्पिक रूप से आप नमूना बिन कर सकते हैं और प्रत्येक बिन (या "पिक्सेल") में मान से मेल खाने के लिए रंग/तीव्रता बदलते हुए, कुछ मोटे अनाज (और संभवतः आपकी आवश्यकता के आधार पर चिकनाई) प्रदर्शित कर सकते हैं। यह आपको 'matplotlib' रखने के लिए अनुमति देता है बिना इसे निपटने के लिए बहुत बड़ी समस्या के अधीन। –

4

हम सक्रिय रूप से बड़े matplotlib स्कैटर प्लॉट के प्रदर्शन पर काम कर रहे हैं। मैं आपको वार्तालाप में शामिल होने के लिए प्रोत्साहित करता हूं (http://matplotlib.1069221.n5.nabble.com/mpl-1-2-1-Speedup-code-by-removing-startswith-calls-and-some-for-loops-td41767.html) और, इससे भी बेहतर, एक समान मामले (https://github.com/matplotlib/matplotlib/pull/2156) के लिए जीवन को बेहतर बनाने के लिए सबमिट किए गए पुल अनुरोध का परीक्षण करें।

एचटीएच

संबंधित मुद्दे