2012-09-12 11 views
5

matplotlib में, यह create SVG figures with hyperlinks संभव है।पाठ लेबल में पायथन, matplotlib, svg और hyperlinks

उदाहरण के लिए, मैं मार्कर बनाने के लिए scatter विधि का उपयोग कर सकता हूं ताकि प्रत्येक व्यक्तिगत मार्कर हाइपरलिंक हो।

हालांकि, मेरे कुछ मार्करों में टेक्स्ट लेबल हैं जिन्हें मैंने text विधि के साथ बनाया है। क्या मैं किसी भी तरह टेक्स्ट लेबल को हाइपरलिंक्स में बदल सकता हूं?


अब तक मैं निम्नलिखित प्राप्त करने में सक्षम हूं। ताकि bbox शब्दकोश एक url पैरामीटर है सबसे पहले, एक सीमांकन बॉक्स के साथ एक पाठ लेबल बनाने:

ax.text(x, y, label, bbox=dict(boxstyle=..., url=url)) 

फिर पैच matplotlib/backends/backend_svg.py (संस्करण 1.1.1) थोड़ा,

साथ

self.writer.end('</a>') 

की जगह

self.writer.end('a') 

अब यह लगभग काम करता है। मैं इस क्षेत्र पर क्लिक कर सकता हूं कि पाठ पाठ से घिरा हुआ है, लेकिन पाठ स्वयं नहीं है (अन्यथा, अगर मेरे पास सफेद पृष्ठभूमि पर काली पाठ है, तो मैं सफेद हिस्सों में कहीं भी क्लिक कर सकता हूं, लेकिन काले हिस्सों में नहीं)।


पूरे टेक्स्ट लेबल को हाइपरलिंक (टेक्स्ट और उसके बाउंडिंग बॉक्स) में बदलने का सबसे आसान तरीका क्या है?

आदर्श रूप से, मैं एक समाधान पसंद करूंगा जिसके लिए मुझे matplotlib लाइब्रेरी को पैच करने की आवश्यकता नहीं है।

+0

ऐसा लगता है कि आपको एक बग मिला है। क्या आप इसे github.com/matplotlib/matplotlib समस्या ट्रैकर पर रिपोर्ट करना चाहते हैं? यदि आपका उत्सुकता है, तो यह काफी पहले सक्षम योगदान भी देगा। ;-) एचटीएच – pelson

+0

@ पेल्सन: ठीक है, '' हिस्सा निश्चित रूप से एक बग है, और निश्चित रूप से यह अच्छा होगा अगर किसी ने इसे ठीक किया हो।हालांकि, मुख्य मुद्दा यह है कि कुछ विशेषताएं गायब हैं, और मुझे नहीं पता कि इन सुविधाओं को कभी भी Matplotlib में लागू किया जाएगा या नहीं। मैं वास्तव में इसके लिए इंतजार नहीं कर सकता, और इसलिए मैं कुछ चाल ढूंढ रहा था जिसे मैं अपने कोड में उपयोग कर सकता था। मैं पहले ही मैटप्लॉटिब द्वारा उत्पादित एसवीजी कोड पोस्ट प्रोसेसिंग जैसी चीजें कर रहा हूं, इसलिए मुझे कोई फर्क नहीं पड़ता कि चाल बदसूरत हैं या नहीं। :) –

उत्तर

0

निम्नलिखित समाधान ठीक काम करने लगता है।

  • एक अद्वितीय स्ट्रिंग के लिए पाठ तत्व की gid विशेषता सेट करें:

    ax.text(x, y, label, gid='foo') 
    
  • हमेशा की तरह एसवीजी फ़ाइल बनाएं; अभी तक कोई हाइपरलिंक्स नहीं हैं।

  • एसवीजी फ़ाइल को पार्स करने के लिए lxml का उपयोग करें। विशेषता विशेषता के साथ अद्वितीय <g> तत्व खोजें। एक्सएमएल पेड़ को संशोधित करें: <a ...><g>...</g></a> के साथ <g>...</g> को प्रतिस्थापित करें। परिणाम बचाओ।

समान दृष्टिकोण सामान्य रूप से काम करता प्रतीत होता है; कई तत्व gid पैरामीटर स्वीकार करते हैं।

1

This change matplotlib गिट में पाठ ऑब्जेक्ट के यूआरएल फ़ील्ड को प्रस्तुत एसवीजी में लिंक के रूप में प्रस्तुत करने में सक्षम बनाता है।

+0

यह बहुत अच्छा आईएमओ है। 1.3.1 के अनुसार, किसी कलाकार के लिए 'set_url() 'का उपयोग करके वास्तविक पाठ को छोड़कर सब कुछ के लिए काम करना प्रतीत होता है। एमटी के छोटे पैच फिक्स करता है कि (इसे विलय कर दिया गया है, इसलिए कोई बस matplotlib को अपडेट कर सकता है)। – travc

+0

शायद एक पाठ की पृष्ठभूमि को एक लिंक भी बनाना चाहता है। 1.3.1 के लिए जो आसानी से कुछ के साथ किया जा सकता है: 'txt = text (x, y, 'something', url = 'something')' 'txt.set_bbox (dict (color = 'w', alpha = 0.01 , url = txt.get_url()) ' रंग और अल्फा थोड़ा हैशिश है ... कम से कम संस्करण 1.3.1 बॉक्स को बनाने के लिए प्रतीत नहीं होता है अगर रंग कोई नहीं है या अल्फा 0 है। – travc

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