2014-07-02 8 views
25

मैं एक matplotlib साजिश के उत्पादन लेने के लिए और यह एक एसवीजी रास्ता है कि मैं एक लेजर कटर पर उपयोग कर सकते हैं में बदल जाने की जरूरत है।मैं एक एसवीजी के रूप में matplotlib साजिश का उत्पादन कैसे प्राप्त कर सकता हूं?

import matplotlib.pyplot as plt 
import numpy as np 
x = np.arange(0,100,0.00001) 
y = x*np.sin(2*pi*x) 
plt.plot(y) 
plt.show() 

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

मुझे "कैरो" नामक एक एसवीजी लाइब्रेरी के बारे में पता है, जो मैटलप्लिब (matplotlib.use('Cairo')) का उपयोग कर सकता है, हालांकि यह मुझे स्पष्ट नहीं है कि इससे मुझे एसवीजी पथ तक पहुंच मिल जाएगी, भले ही मैटलप्लिपिब अब उपयोग कर रहे हों साजिश उत्पन्न करने के लिए काहिरा।

enter image description here

मैं काहिरा अपने सिस्टम पर काम कर रहा है, और सफलतापूर्वक कि मैं वास्तव में Illustrator में संपादित करें, लेकिन मैं इसके बाद के संस्करण में मेरी समीकरण लेने के लिए एक तरीका मौजूद नहीं है सकते हैं एसवीजी पथ से बना एक उदाहरण आकर्षित कर सकते हैं एक एसवीजी पथ।

import cairo 
from cairo import SVGSurface, Context, Matrix  
s = SVGSurface('example1.svg', WIDTH, HEIGHT) 
c = Context(s) 

# Transform to normal cartesian coordinate system 
m = Matrix(yy=-1, y0=HEIGHT) 
c.transform(m) 

# Set a background color 
c.save() 
c.set_source_rgb(0.3, 0.3, 1.0) 
c.paint() 
c.restore() 

# Draw some lines 
c.move_to(0, 0) 
c.line_to(2 * 72, 2* 72) 
c.line_to(3 * 72, 1 * 72) 
c.line_to(4 * 72, 2 * 72) 
c.line_to(6 * 72, 0) 
c.close_path() 
c.save() 
c.set_line_width(6.0) 
c.stroke_preserve() 
c.set_source_rgb(0.3, 0.3, 0.3) 
c.fill() 
c.restore() 

# Draw a circle 
c.save() 
c.set_line_width(6.0) 
c.arc(1 * 72, 3 * 72, 0.5 * 72, 0, 2 * pi) 
c.stroke_preserve() 
c.set_source_rgb(1.0, 1.0, 0) 
c.fill() 
c.restore() 

# Save as a SVG and PNG 
s.write_to_png('example1.png') 
s.finish() 

enter image description here

(ध्यान दें कि छवि यहाँ प्रदर्शित एक png है, stackoverflow प्रदर्शन के लिए svg ग्राफिक्स स्वीकार नहीं करता है के रूप में)

उत्तर

35

आप सबसे शायद छवि का आकार तय करने के लिए और सभी से छुटकारा पाने चाहते हैं पृष्ठभूमि और अक्ष मार्करों के RTS:

import matplotlib.pyplot as plt 
import numpy as np 

plt.figure(figsize=[6,6]) 
x = np.arange(0,100,0.00001) 
y = x*np.sin(2*pi*x) 
plt.plot(y) 
plt.axis('off') 
plt.gca().set_position([0, 0, 1, 1]) 
plt.savefig("test.svg") 

परिणामी SVG फ़ाइल के रूप में savefig वास्तव में आंकड़ा पृष्ठभूमि बचाना चाहता है, केवल एक अतिरिक्त तत्व शामिल है। इस पृष्ठभूमि का रंग 'कोई नहीं' में बदलना आसान है, लेकिन ऐसा लगता है कि इससे छुटकारा नहीं मिलता है। वैसे भी, एसवीजी अन्यथा और सही पैमाने (1/72 "प्रति यूनिट) में बहुत साफ है।

+5

धन्यवाद। दिलचस्प बात यह है कि मैं अगर मैं plt.show बुलाया plt.show बुला() से पहले ऊपर करने के लिए की जरूरत है।() savefig से पहले svg जब चित्रकार में खोला सिर्फ एक सफेद पृष्ठभूमि में किया जा रहा समाप्त हो गया। – user391339

+0

@ user391339 महान जगह है। मैं खाली-सफेद-बचाने के। यह ज्ञात है क्यों यह? – josh

+0

@josh होता है के साथ एक असली मुद्दा यह सिर्फ नहीं है हो रही थी । https://stackoverflow.com/questions/9012487/matplotlib-pyplot-savefig-outputs-blank-image: एसवीजी के लिए यहाँ देखें – gidim

17

बैकएंड आप उपयोग पर निर्भर करता है (मैं TkAgg पर परीक्षण किया और Agg) यह savefig भीतर यह निर्दिष्ट करने के रूप में के रूप में आसान होना चाहिए() फोन:

import matplotlib.pyplot as plt                                        
import numpy as np 
x = np.arange(0,100,0.00001) 
y = x*np.sin(2*np.pi*x) 
plt.plot(y) 
plt.savefig("test.svg", format="svg") 
संबंधित मुद्दे