Matplotlib SVG: प्लॉट और लोगो को पाथ के रूप में रखें
Matplotlib प्लॉट को SVG में एक्सपोर्ट करें, svgutils से अलग लोगो पाथ जोड़ें और वितरण फ़ाइल में एम्बेड किए गए पिक्सेल, स्थिति तथा फ़ॉन्ट बदलाव जाँचें।
इस पेज पर
Matplotlib चित्र के अंदर लोगो को वेक्टर बनाए रखने के लिए प्लॉट को SVG में एक्सपोर्ट करें और उसमें लोगो की मौजूदा SVG ज्यामिति जोड़ें। OffsetImage से PNG रखने पर SVG में वेक्टर प्लॉट रेखाओं के साथ रास्टर इमेज भी आ सकती है। केवल एक्सटेंशन यह नहीं बताता कि कौन-से हिस्से पाथ हैं।
यह मार्गदर्शिका इन कामों को अलग रखती है: Matplotlib डेटा से प्लॉट बनाता है और svgutils उसके बगल में सजावटी बैज रखता है। अगर मूल चित्र पहले से वेक्टर है, तो उसका इस्तेमाल करें। अगर केवल उपयुक्त रास्टर चित्र बचा है, तो उसे अलग से पुनर्निर्मित करें। संख्यात्मक निशान, अक्ष और लेबल प्लॉट के मूल स्रोत में रखें।
संक्षिप्त प्रक्रिया
प्लॉट एक्सपोर्ट करें, अलग चित्र जोड़ें, बने SVG को जाँचें और फिर वही फ़ाइल दोबारा खोलें जो आप देंगे। प्लॉटिंग स्क्रिप्ट और चित्र का मूल संस्करण रखें, ताकि अगले डेटा बदलाव पर चित्र फिर बनाया जा सके।
तय करें कि प्लॉट के मूल स्रोत में क्या होना चाहिए
लोगो चित्र है; अक्ष का टिक प्लॉट का हिस्सा है। दोनों को एक इमेज मानने से बाद के बदलाव कठिन हो जाते हैं।
| चित्र की सामग्री | पसंदीदा स्रोत | क्या सत्यापित करें |
|---|---|---|
| रेखाएँ, मार्कर, अक्ष और डेटा लेबल | Matplotlib प्लॉटिंग कोड | मान, लेबल और प्लॉट संबंधी विकल्प |
| मौजूदा वेक्टर लोगो या चित्र | उसकी मूल SVG फ़ाइल | पाथ, सीमाएँ और निर्भरताएँ |
| रास्टर फ़ोटो या माइक्रोस्कोपी पैनल | मूल रास्टर इमेज | अंतिम आकार पर रेज़ॉल्यूशन |
| सरल सजावटी आकृति जिसका वेक्टर मूल खो गया है | अलग से जाँचा हुआ संभावित पुनर्निर्माण | आकृति की समानता और अनचाहे क्षेत्र |
अगर कुछ पैनल फ़ोटो हैं, तो पूरा चित्र वेक्टर होना ज़रूरी नहीं। उन्हें रास्टर रखें। लक्ष्य है हर हिस्से के लिए सही मूल स्रोत सुरक्षित रखना और फिर संयुक्त परिणाम जाँचना।
Matplotlib का savefig संदर्भ आउटपुट फ़ॉर्मैट स्पष्ट रूप से चुनना बताता है। उसका OffsetImage API SVG पाथ इंपोर्टर के बजाय इमेज कंटेनर बताता है। फ़ाइल स्तर की जाँच के लिए SVG के अंदर रास्टर इमेज कैसे खोजें देखें।
दी जाने वाली फ़ाइलों में क्या है
हमने उदाहरण Python 3.12, Matplotlib 3.10.7 और svgutils 0.3.4 के साथ चलाया। बैज दो पाथ वाला मूल आरेख है। प्लॉट के चार मान केवल उदाहरणात्मक डेटा हैं, कोई प्रयोग या उत्पाद बेंचमार्क नहीं।
तुलना में दोनों फ़ाइलों का प्लॉट समान है। बाईं तरफ OffsetImage से 32 × 32 PNG बैज रखा गया है। दाईं तरफ उसके SVG पाथ एक्सपोर्ट किए गए प्लॉट के साथ जोड़े गए हैं। बड़े करके दिखाए गए क्षेत्र इन्हीं वास्तविक वितरण फ़ाइलों से हैं।

SVG तत्व गिनने पर ये परिणाम मिले:
| फ़ाइल | Image तत्व | Path तत्व | Text तत्व |
|---|---|---|---|
| केवल प्लॉट | 0 | 8 | 15 |
| PNG बैज वाला प्लॉट | 1 | 8 | 15 |
| SVG बैज पाथ वाला प्लॉट | 0 | 10 | 15 |
ये संख्याएँ इसी छोटे परीक्षण उदाहरण पर लागू होती हैं। पाथ की संख्या गुणवत्ता अंक नहीं है और image तत्व शून्य होना साबित नहीं करता कि हर SVG सुविधा दूसरे ऐप में सुरक्षित रहेगी। इससे यह ज़रूर स्थापित होता है कि संयुक्त फ़ाइल का बैज एम्बेड किए गए PNG के बजाय ज्यामिति है।
स्पष्ट सीमाओं वाला प्लॉट एक्सपोर्ट करें
प्रोजेक्ट परिवेश में यहाँ इस्तेमाल किए गए संस्करण इंस्टॉल करें:
python -m pip install matplotlib==3.10.7 svgutils==0.3.4इसे plot.py नाम से सेव करें और खाली कार्य फ़ोल्डर में चलाएँ:
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
plt.rcParams["svg.fonttype"] = "none"
fig = plt.figure(figsize=(6, 3), dpi=72)
ax = fig.add_axes([0.14, 0.22, 0.58, 0.65])
ax.plot([0, 1, 2, 3], [1, 2, 1.5, 3],
marker="o", color="#173b40")
ax.set(xlabel="Example x", ylabel="Example y",
title="Illustrative data only")
ax.spines[["top", "right"]].set_visible(False)
fig.savefig("plot.svg", format="svg")
plt.close(fig)अक्ष चित्र के केवल एक हिस्से में हैं, जिससे दाईं ओर बैज की जगह बचती है। इस एक्सपोर्ट का viewBox, 0 0 432 216 है और बाहरी आयाम 432pt गुणा 216pt हैं।
बाहरी चित्र रखते समय ये सीमाएँ स्थिर रखें। bbox_inches="tight" जोड़ने से सेव की गई सीमाएँ बदलती हैं, जैसा savefig दस्तावेज़ बताता है। अगर कसकर क्रॉप करना हो, तो एक्सपोर्ट किए गए viewBox को जाँचें और उसके बाद संयोजन के निर्देशांक अपडेट करें।
svg.fonttype="none" सेटिंग उदाहरण के लेबल टेक्स्ट के रूप में रखती है। Matplotlib के फ़ॉन्ट दस्तावेज़ SVG टेक्स्ट और पाथ आउटपुट के विकल्प बताते हैं। संपादन योग्य टेक्स्ट को फ़ाइल लेने वाले परिवेश में उपयुक्त फ़ॉन्ट चाहिए। अगर अक्षरों की आकृति स्थिर चाहिए, तो सोच-समझकर पाथ आउटपुट चुनें और लेबल संपादन के लिए प्लॉट का मूल स्रोत रखें। SVG फ़ॉन्ट बदलाव की मार्गदर्शिका यह समझौता समझाती है।
चित्र को रास्टर बनाए बिना जोड़ें
इस मूल बैज को plot.svg के साथ badge.svg नाम से सेव करें:
<svg xmlns="http://www.w3.org/2000/svg"
width="100" height="100" viewBox="0 0 100 100">
<path fill="#173b40" fill-rule="evenodd"
d="M30 5H70L95 30V70L70 95H30L5 70V30Z
M34 17L17 34V66L34 83H66L83 66V34L66 17Z"/>
<path fill="#28bfa3" d="M53 23L30 55H47L43 77L70 43H53Z"/>
</svg>फिर यह संयोजन स्क्रिप्ट चलाएँ:
import svgutils.transform as sg
page = sg.SVGFigure("432pt", "216pt")
page.root.set("viewBox", "0 0 432 216")
chart = sg.fromfile("plot.svg").getroot()
badge = sg.fromfile("badge.svg").getroot()
badge.moveto(332, 76, scale_x=0.64)
page.append([chart, badge])
page.save("vector-logo.svg")यह svgutils चित्र संयोजन ट्यूटोरियल की लोड करने, ट्रांसफ़ॉर्म करने, जोड़ने और सेव करने की विधि अपनाता है। हमने svgutils 0.3.4 में समर्थित scale_x आर्ग्युमेंट इस्तेमाल किया; पुराना ट्यूटोरियल अलग स्केलिंग आर्ग्युमेंट दिखाता है।
बैज का 100 इकाइयों वाला चित्र 64 इकाइयाँ चौड़ा हो जाता है। उसका ऊपर-बायाँ कोना प्लॉट की निर्देशांक प्रणाली में (332, 76) पर है। स्पष्ट बाहरी आयाम और viewBox इस परीक्षण उदाहरण में स्थिति को साफ़ रखते हैं। ये पेज निर्देशांक हैं, डेटा निर्देशांक नहीं: प्लॉट में डेटा बिंदु खिसकाने से बैज उसके साथ नहीं खिसकेगा।
बदलते डेटा बिंदु से जुड़े एनोटेशन के लिए प्लॉट निर्देशांक से एक्सपोर्ट किए गए पेज तक स्पष्ट मैपिंग रखें, या ऐसा संयोजन टूल इस्तेमाल करें जो यह संबंध बनाए रखे। स्थिर पेज स्थिति कोने के लोगो या अलग उदाहरणात्मक पैनल के लिए उपयुक्त है।
मूल SVG में पाथ के अलावा भी सुविधाएँ हो सकती हैं। जिस SVG में पहले से PNG एम्बेड है, उसे जोड़ने के बाद भी सामग्री मिश्रित रहती है। अधिक जटिल फ़ाइलें मिलाते समय संदर्भित ID, फ़ॉन्ट और बाहरी लिंक वाले एसेट भी जाँचें। इस उदाहरण के बैज में वे निर्भरताएँ नहीं हैं।
फ़ाइल जाँचें, फिर संशोधन परखें
vector-logo.svg को ब्राउज़र या इच्छित एडिटर में खोलें। बैज का बीच का छेद, प्लॉट लेबल और उनके बीच की खाली जगह जाँचें। चित्र को बड़े आकार के साथ वास्तविक इस्तेमाल के आकार पर भी देखें।
पूर्वावलोकन पर निर्भर हुए बिना छोटा XML परीक्षण संरचना की पुष्टि कर सकता है:
import xml.etree.ElementTree as ET
root = ET.parse("vector-logo.svg").getroot()
ns = "{http://www.w3.org/2000/svg}"
for tag in ("image", "path", "text"):
print(tag, len(root.findall(".//" + ns + tag)))दिए गए परीक्षण उदाहरण में इससे image 0, path 10 और text 15 प्रिंट होता है। रास्टर तुलना में प्लॉट के आठ पाथ बने रहते हैं और image 1 प्रिंट होता है। उस तुलना का image संदर्भ PNG डेटा रखता है; वह स्वयंपूर्ण रास्टर सामग्री है, गायब बाहरी लोगो फ़ाइल नहीं।
अब plot.py का अंतिम उदाहरणात्मक y मान बदलें, उसे दोबारा चलाएँ और संयोजन भी फिर चलाएँ। प्लॉट बदलना चाहिए, जबकि बैज पेज पर अपनी आरक्षित जगह पर रहे। संशोधन की यह जाँच ऐसी प्रक्रिया पकड़ती है जो एक बार सही दिखती है, लेकिन पुराने प्लॉट एक्सपोर्ट पर निर्भर है।
अगला वितरण चरण अलग जाँचें। अगर चित्र किसी दस्तावेज़ में जाएगा, तो LaTeX SVG प्रक्रिया एक्सपोर्ट और लेबल विकल्प समझाती है। केवल सफल ब्राउज़र पूर्वावलोकन जर्नल की शर्तों का पालन या अंतिम PDF में सुरक्षित रहना साबित नहीं करता।
केवल उसी चित्र का पुनर्निर्माण करें जिसे उसकी ज़रूरत है
जब प्लॉट का मूल स्रोत उपलब्ध हो, तो उसी से एक्सपोर्ट करें। वेक्टराइज़ेशन स्क्रीनशॉट से संख्यात्मक डेटा या प्लॉटिंग कमांड वापस नहीं ला सकता।
PerfectVector उस सीमित मामले में उपयुक्त है जहाँ सरल सजावटी लोगो या चित्र केवल रास्टर इमेज में बचा हो। उसकी वैज्ञानिक चित्र पुनर्निर्माण प्रक्रिया में केवल उस चित्र तक क्रॉप करें, संभावित वेक्टर का पूर्वावलोकन देखें और छेद, पतली आकृतियाँ तथा अनचाहे पृष्ठभूमि क्षेत्र जाँचें। अक्ष, मापे गए निशान और लेबल ट्रेस से बाहर रखें। स्वीकार किए गए चित्र SVG को मूल प्लॉट के साथ जोड़ें, फिर वितरण फ़ाइल की जाँच दोहराएँ।
मूल वेक्टर फ़ाइल उपलब्ध हो तो हमेशा उसका इस्तेमाल करें। ट्रेसिंग किसी ज़रूरी विवरण को खो दे तो सरल निशान हाथ से फिर बनाएँ। फ़ोटो वाले पैनल रास्टर रखें। इमेज वेक्टराइज़ेशन का परिचय यह रास्ता चुनने से पहले बताता है कि ट्रेसिंग क्या पुनर्निर्मित कर सकती है।
अक्सर पूछे जाने वाले सवाल
क्या Matplotlib चित्र को SVG में सेव करने से PNG लोगो वेक्टर बन जाता है? नहीं। परीक्षण किए गए OffsetImage तरीके में प्लॉट वेक्टर ज्यामिति के रूप में एक्सपोर्ट होता है, जबकि PNG लोगो SVG के अंदर image तत्व रहता है।
क्या SVG लोगो को डेटा निर्देशांक से रखा जा सकता है? यहाँ दिखाया गया संयोजन एक्सपोर्ट किए गए पेज निर्देशांक इस्तेमाल करता है। डेटा बिंदु से जुड़े लोगो के लिए स्पष्ट निर्देशांक मैपिंग या उस संबंध को बनाए रखने वाला टूल चाहिए।
मेरे लेबल पाथ क्यों बन गए? Matplotlib की SVG फ़ॉन्ट आउटपुट सेटिंग तय करती है कि लेबल टेक्स्ट के रूप में एक्सपोर्ट होंगे या ग्लिफ़ पाथ के रूप में। एक्सपोर्ट से पहले यह सेटिंग चुनें और बाद में शब्द बदलने के लिए प्लॉट का मूल स्रोत रखें।
स्रोत
- Matplotlib — savefig — स्पष्ट SVG एक्सपोर्ट और कसकर सीमित बाउंडिंग बॉक्स का प्रभाव।
- Matplotlib — OffsetImage — रास्टर तुलना में इस्तेमाल किया गया इमेज कंटेनर व्यवहार।
- Matplotlib — Matplotlib में फ़ॉन्ट — SVG टेक्स्ट और ग्लिफ़ पाथ आउटपुट विकल्प।
- svgutils — प्रकाशन योग्य चित्र बनाना — अलग प्लॉट एक्सपोर्ट, SVG संयोजन, ट्रांसफ़ॉर्म और संयुक्त चित्र सेव करना।
प्लॉट को उसके कोड से एक्सपोर्ट करें और चित्र अलग रखें। अगर केवल रास्टर सजावटी आकृति बची है, तो संभावित SVG चित्र तैयार करें, उसके छेद और सीमाएँ जाँचें, फिर उसे प्लॉट के साथ जोड़ें और ठीक वही वितरण फ़ाइल पिक्सेल, स्थिति तथा लेबल बदलावों के लिए जाँचें।
Blog से और

jsPDF SVG: ब्राउज़र में बने PDF में लोगो पाथ रखें
jsPDF के साथ svg2pdf.js इस्तेमाल करके SVG लोगो रखें, समर्थित पाथ सुरक्षित रखें, PDF में उसका आकार तय करें और सहेजी गई फ़ाइल की तुलना उसी चित्र के रास्टर निर्यात से करें।

WPF में SVG: रेंडरर या XAML ड्रॉइंग चुनें
रेंडरर, WPF का अंतर्निहित DrawingImage या PNG निर्यात से WPF में SVG चित्र उपयोग करें। मौलिक आइकन उदाहरण अपनाएँ और सीमाएँ, रंग तथा निर्भरताएँ जाँचें।