2012-02-03 20 views
9

मैंने सफलतापूर्वक matplotlib का उपयोग कर दिनांक अनुक्रमित डेटा (एक्स अक्ष दिनांक है) का एक सेट प्लॉट किया है। हालांकि, मैं प्लॉट किए गए ग्राफ पर मैन्युअल रूप से ड्रॉ लाइन (दिनांक 1, वाई 1) से दूसरे (दिनांक 2, वाई 2) में सक्षम होना चाहता हूं।matplotlib इंटरैक्टिव ग्राफिंग (मैन्युअल रूप से ग्राफ पर रेखाचित्र रेखाचित्र)

मुझे ऐसा कोई उदाहरण नहीं दिख रहा है जो यह दिखाता है कि यह कैसे करें - या वास्तव में यदि यह भी सकारात्मक है।

संक्षेप में, यह है कि मैं क्या करना चाहते हैं:

  1. लोड मैन्युअल खींची गई रेखा डेटा दर्ज करने के लिए मैन्युअल रूप से खींची गई रेखा डेटा साजिश रची ग्राफ
  2. सहेजें पर लाइनों का एक सेट ड्रा फ़ाइल से
  3. आदर्श रूप में (ग्राफ बनाना), मैं तैयार की लाइनों के बारे में 'मेटा डेटा' स्टोर करने के लिए चाहते हैं (उदाहरण के लिए रंग, रेखा-चौड़ाई आदि)

क्या कोई कंकाल स्निपेट पोस्ट कर सकता है (अधिमानतः आगे की जानकारी के लिंक के साथ), यह दिखाने के लिए कि मैं इसे कार्यान्वित करने के साथ कैसे शुरू कर सकता हूं (मुख्य आवश्यकताएं ग्राफ पर मैन्युअल रूप से रेखाएं खींचने की क्षमता होती हैं और फिर लाइनों को सहेजने/लोड करने की क्षमता होती हैं भूखंड)।

नोट: तक 'मैन्युअल', मैं एक बिंदु पर क्लिक करने के बाद साजिश रची ग्राफ में एक अन्य बिंदु पर क्लिक करके लाइनों आकर्षित करने के लिए सक्षम होने के लिए मतलब है। दो अंक के बीच एक रेखा (या बस एक बिंदु पर क्लिक करके और खींच और साजिश रची ग्राफ पर एक और बिंदु पर माउस को रिहा)

[[अपडेट]]

Dawe, बहुत ज्यादा के लिए धन्यवाद आकर्षित करने के लिए आपके द्वारा प्रदान किया गया स्निपेट। यह मैं हूँ कि मैं क्या करने की कोशिश कर रहा हूँ करने के लिए अनुमति देता है - लेकिन, जैसे ही लाइन कैनवास (दूसरा माउस क्लिक करने के बाद) पर तैयार की है, जीयूआई दुर्घटनाओं और मैं कंसोल पर यह चेतावनी संदेश मिलता है:

/usr/local/lib/python2.6/dist-packages/matplotlib/backend_bases.py:2192: DeprecationWarning: Using default event loop until function specific to this GUI is implemented 
    warnings.warn(str,DeprecationWarning) 

क्या आप जानते हैं कि इस चेतावनी और अचानक कार्यक्रम की समाप्ति क्या हो रही है?

इसके अलावा, क्या ग्राफ पर एक से अधिक पंक्तियां खींचना संभव है? (मुझे लगता है कि इसमें किसी प्रकार का इवेंट हैंडलर लिखना शामिल होगा जो एक लाइनरेवर वैरिएबल को तुरंत चालू करेगा)। फिलहाल, मुझे 'ऐप' अचानक समाप्त होने से पहले केवल एक पंक्ति खींचने का मौका मिलता है।

+0

"मैन्युअल" अस्पष्ट है (और इसे बोल्ड में डालकर अस्पष्टता को हल नहीं करता है) द्वारा आवश्यक मेटाडेटा भी पास कर सकते हैं। क्या आप एक बिंदु पर और फिर किसी अन्य पर क्लिक करके मैन्युअल रूप से मतलब रखते हैं, या क्या आप कुछ टाइप करके मैन्युअल रूप से मतलब है? या तो पर्याप्त होगा? – DSM

+0

@DSM: प्रश्न में उपयोग किए गए 'मैन्युअल' के अर्थ को स्पष्ट किया।एचटीएच –

+0

http://matplotlib.sourceforge.net/api/widgets_api.html शुरू करने के लिए जगह हो सकती है। –

उत्तर

9

मैं कुछ इस तरह लिखना होगा:

import matplotlib.pyplot as plt 
class LineDrawer(object): 
    lines = [] 
    def draw_line(self): 
     ax = plt.gca() 
     xy = plt.ginput(2) 

     x = [p[0] for p in xy] 
     y = [p[1] for p in xy] 
     line = plt.plot(x,y) 
     ax.figure.canvas.draw() 

     self.lines.append(line) 

का उपयोग ginput() आप और अधिक जटिल घटना से निपटने से बच सकते हैं।

plt.plot([1,2,3,4,5]) 
ld = LineDrawer() 
ld.draw_line() # here you click on the plot 

बचत/एक फाइल करने के लिए लाइन डेटा लोड हो रहा आप आसानी से एक विधि pickle या shelve का उपयोग कर लागू कर सकते हैं के लिए: जिस तरह से यह 'काम करता है' आप साजिश कुछ है। आप विधि draw_line()

+2

+1 जो मुझे वहां (लगभग) प्राप्त करता है। यह ** बिल्कुल ** ** मैं क्या करने की कोशिश कर रहा हूँ! बहुत बहुत धन्यवाद!। वर्तमान स्निपेट (छोटे नामस्थान मुद्दे के अलावा) के साथ एक छोटी सी समस्या है। जब मैं स्क्रिप्ट चलाता हूं, तो यह मुझे क्लिक करके कैनवास पर आकर्षित करने की अनुमति देता है (जैसे मैं चाहता था) - हालांकि, दूसरे माउस पर क्लिक करें, जब लाइन खींची जाती है, तो जीयूआई तुरंत क्रैश हो जाता है, और मेरे पास कंसोल पर एक चेतावनी केसेज है (कृपया मेरा अद्यतन प्रश्न देखें) –

+0

सुनिश्चित करें कि आप इस कोड को आईपीथॉन पिलैब मोड में चलाएं: 'ipython -pylab'। यह बैकएंड के लिए इवेंट लूप सेट करता है जिसका उपयोग आप इस त्वरित और गंदे अंतःक्रियाशीलता के काम को सही तरीके से कर रहे हैं। – dawe

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