2012-07-18 10 views
6

मैं जानना चाहता हूं कि बेसमेप प्लॉट में पॉपअप बॉक्स कैसे बनाएं। जब मैं अपने माउस को किसी स्थान पर घुमाता हूं, तो उसे पॉपअप बॉक्स को ट्रिगर करना चाहिए।Matplotlib basemap: पॉपअप बॉक्स

क्या यह संभव है?

उत्तर

25

हां यह संभव है matplotlib के ईवेंट हैंडलिंग ढांचे के लिए धन्यवाद। मुझे पहले से लिखित उदाहरण नहीं मिल सका जो आप विशेष रूप से रुचि रखते हैं, इसलिए मैंने एक लिखा (जिसे मैं matplotlib स्रोत में शामिल करने के लिए आगे रखूंगा)।

मैं http://matplotlib.sourceforge.net/users/event_handling.html को अच्छी तरह से समझने के लिए पढ़ रहा हूं कि क्या हो रहा है। कृपया ध्यान दें कि यद्यपि यह सही समाधान की तरह लगता है "pick_event" माउस क्लिक के लिए है- माउस ओवर-इवेंट्स के लिए नहीं है और इस मामले में काम नहीं करता है।

मेरे कोड है, जो बहुत अच्छी तरह से एक चाहते चाहिए objectified किया जा सकता है, लगता है:

import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = plt.axes() 


points_with_annotation = [] 
for i in range(10): 
    point, = plt.plot(i, i, 'o', markersize=10) 

    annotation = ax.annotate("Mouseover point %s" % i, 
     xy=(i, i), xycoords='data', 
     xytext=(i + 1, i), textcoords='data', 
     horizontalalignment="left", 
     arrowprops=dict(arrowstyle="simple", 
         connectionstyle="arc3,rad=-0.2"), 
     bbox=dict(boxstyle="round", facecolor="w", 
        edgecolor="0.5", alpha=0.9) 
     ) 
    # by default, disable the annotation visibility 
    annotation.set_visible(False) 

    points_with_annotation.append([point, annotation]) 


def on_move(event): 
    visibility_changed = False 
    for point, annotation in points_with_annotation: 
     should_be_visible = (point.contains(event)[0] == True) 

     if should_be_visible != annotation.get_visible(): 
      visibility_changed = True 
      annotation.set_visible(should_be_visible) 

    if visibility_changed:   
     plt.draw() 

on_move_id = fig.canvas.mpl_connect('motion_notify_event', on_move) 

plt.show() 

उम्मीद है कि सब कुछ काफी पठनीय होना चाहिए। कोड की एक उच्च स्तरीय अवलोकन जाता है:

  • [बिंदु, एनोटेशन] जोड़े, जहां डिफ़ॉल्ट रूप से एनोटेशन दिखाई
  • एक समारोह रजिस्टर नहीं है की एक सूची बनाएं, "on_move", हर बार के नाम से जाना माउस गति का पता चला है
  • ऑन_मोव फ़ंक्शन प्रत्येक बिंदु और एनोटेशन के माध्यम से पुनरावृत्त करता है, यदि माउस अब अंक में से एक पर है, तो इसके संबंधित एनोटेशन दृश्यमान बनाते हैं, यदि यह नहीं है, तो इसे अदृश्य बना दें। (शामिल विधि documented here है)

Screenshot of the result

+0

आह सुंदर, आप कोड और विवरण के लिए @pelson धन्यवाद। तो इसका मतलब है कि साजिश पर किसी स्थान पर होवर करने के लिए कोई प्रत्यक्ष ईवेंट हैंडलर नहीं है। इसे परोक्ष रूप से किया जाना चाहिए। –

+0

नहीं। आप 'on_move' फ़ंक्शन में माउस ईवेंट के एक्स और वाई निर्देशांक तक पहुंच सकते हैं। उस से आप कुछ भी कर सकते हैं। मेरे मामले में मैंने सभी कलाकारों को देखा है और पहचान की है कि किसी में माउस की स्थिति है, लेकिन आप एक्स और वाई के बाद एक एकल एनोटेशन इंस्टेंस की स्थिति को समान रूप से अपडेट कर सकते हैं। – pelson

+0

हाँ आप उस बिंदु पर सही हैं, लेकिन मैं किसी विशेष कलाकार को "hover_event" जैसे किसी ईवेंट के साथ कॉलबैक पंजीकृत करने की तरह कुछ ढूंढ रहा था, जिसका मतलब है कि मेरा प्रत्यक्ष अर्थ –

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