2010-03-29 10 views
37

मैं matplotlib में अक्ष अक्ष पर एक किंवदंती चित्रित कर रहा हूं लेकिन डिफ़ॉल्ट स्थिति जो इसे स्मार्ट स्थान पर रखने का दावा करती है, काम नहीं कर रही है। आदर्श रूप से, मैं किंवदंती उपयोगकर्ता द्वारा खींचने योग्य होना चाहता हूं। यह कैसे किया जा सकता है?matplotlib में ड्रैगगेबल किंवदंती कैसे बनाएं?

+0

एडम: यह देखते हुए कि इस, पर्याप्त पूरी तरह से है, और पर्याप्त रूप से प्रासंगिक matplotlib distro में शामिल करने के लिए गया था, और यह देखते हुए कि (मुझे लगता है कि) आप अपने मूल प्रश्न से हटाया आप शीर्ष पर वाक्य के एक जोड़े सहित मन होगा इस क्यू के लिए उपयोगकर्ता इस बारे में एक विचार प्राप्त कर सकते हैं कि यह कोड क्या है (उन्हें कोड के माध्यम से पढ़ने से बचाने के लिए)। और अच्छा काम, जिस तरह से मेरे +1 से। – doug

+0

धन्यवाद डॉउग। जैसा कि आपने सुझाव दिया था, मैंने शीर्ष पर प्रश्न को phrased किया। उम्मीद है कि यह सहायक होगा। :] –

+0

इसे माध्यमिक धुरी के लिए बढ़ाया जा सकता है? – denfromufa

उत्तर

28

नोट: उम्मीद


के रूप में अच्छी तरह से यह अब matplotlib

leg = plt.legend() 
if leg: 
    leg.draggable() 

में बनाया गया है काम करेंगे, मैंने पाया बिट और समाधान मेलिंग सूची के बीच बिखरे हुए के टुकड़े। मैं कोड का एक अच्छा मॉड्यूलर हिस्सा है कि आप में ड्रॉप और उपयोग कर सकते हैं के साथ आ गए हैं ... यहाँ यह है:

class DraggableLegend: 
    def __init__(self, legend): 
     self.legend = legend 
     self.gotLegend = False 
     legend.figure.canvas.mpl_connect('motion_notify_event', self.on_motion) 
     legend.figure.canvas.mpl_connect('pick_event', self.on_pick) 
     legend.figure.canvas.mpl_connect('button_release_event', self.on_release) 
     legend.set_picker(self.my_legend_picker) 

    def on_motion(self, evt): 
     if self.gotLegend: 
      dx = evt.x - self.mouse_x 
      dy = evt.y - self.mouse_y 
      loc_in_canvas = self.legend_x + dx, self.legend_y + dy 
      loc_in_norm_axes = self.legend.parent.transAxes.inverted().transform_point(loc_in_canvas) 
      self.legend._loc = tuple(loc_in_norm_axes) 
      self.legend.figure.canvas.draw() 

    def my_legend_picker(self, legend, evt): 
     return self.legend.legendPatch.contains(evt) 

    def on_pick(self, evt): 
     if evt.artist == self.legend: 
      bbox = self.legend.get_window_extent() 
      self.mouse_x = evt.mouseevent.x 
      self.mouse_y = evt.mouseevent.y 
      self.legend_x = bbox.xmin 
      self.legend_y = bbox.ymin 
      self.gotLegend = 1 

    def on_release(self, event): 
     if self.gotLegend: 
      self.gotLegend = False 

... और अपने कोड में ...

def draw(self): 
    ax = self.figure.add_subplot(111) 
    scatter = ax.scatter(np.random.randn(100), np.random.randn(100)) 


legend = DraggableLegend(ax.legend()) 

मैंने मैटलप्लिब-यूजर ग्रुप को ईमेल किया और जॉन हंटर एसवीएन हेड में अपना समाधान जोड़ने के लिए काफी दयालु था।

गुरु, 28 Jan, 2010 को पर 3:02 प्रधानमंत्री एडम फ्रेजर लिखा है:

मैंने सोचा कि मैं के बाद से खींचने योग्य कथा समस्या का समाधान का हिस्सा था यह मुझे हमेशा के लिए ले लिया मेलिंग सूचियों पर सभी बिखरे हुए ज्ञान को आत्मसात करने के लिए ...

कूल - अच्छा उदाहरण। मैंने कोड को legend.py में जोड़ा। अब आप

पैर = ax.legend कर सकते हैं()
leg.draggable()

खींचने योग्य मोड सक्षम करने। आप ड्रैगगेबल स्थिति टॉगल करने के लिए बार-बार इस func को कॉल कर सकते हैं।

मुझे आशा है कि यह matplotlib के साथ काम करने वाले लोगों के लिए सहायक होगा।

13

Matplotlib (v1.0.1) के नए संस्करणों में, यह अंतर्निहित है।

def draw(self): 
    ax = self.figure.add_subplot(111) 
    scatter = ax.scatter(np.random.randn(100), np.random.randn(100)) 
    legend = ax.legend() 
    legend.draggable(state=True) 

यदि आप matplotlib इंटरैक्टिव रूप से उपयोग कर रहे हैं (उदाहरण के लिए, आईपीथन के पिलैब मोड में)।

plot(range(10), range(10), label="test label") 
plot(range(10), [5 for x in range(10)], label="another test") 
l = legend() 
l.draggable(True) 
संबंधित मुद्दे