2014-07-02 17 views
25

Potrzebuję pobrać wydruk matplotlib i zamienić go na ścieżkę SVG, którą mogę użyć na wycinarce laserowej.Jak mogę uzyskać dane wyjściowe z wykresu matplotlib jako SVG?

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() 

Na przykład poniżej widać kształt fali. Chciałbym móc wypisać lub zapisać ten kształt fali jako ścieżkę SVG, którą będę mógł później wykorzystać w programie takim jak Adobe Illustrator.

Jestem zaznajomiony z biblioteką SVG o nazwie "Kair", z której może korzystać matplotlib (matplotlib.use('Cairo')), ale nie jest dla mnie jasne, że da mi dostęp do ścieżki SVG, której potrzebuję, mimo że matplotlib będzie teraz używać Kair, aby wygenerować fabułę.

enter image description here

muszę Cairo pracuje na systemie, mogą z powodzeniem czerpać przykład złożoną ścieżek SVG, że rzeczywiście może edytować w programie Illustrator, ale nie mam sposób na moje równanie powyższe pod ścieżka SVG.

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

(zauważ, że obraz wyświetlany o to png, jak stackoverflow nie akceptuje grafiki svg dla wyświetlacza)

Odpowiedz

35

będziesz najprawdopodobniej chcą ustalić rozmiar obrazu i pozbyć się wszystkich tak rts środowisk i znaczników osi:

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") 

Powstały plik SVG zawiera tylko jeden dodatkowy element, jak savefig naprawdę chce zaoszczędzić tła rysunku. Kolor tego tła można łatwo zmienić na "none", ale wydaje się, że się go nie pozbędzie. W każdym razie, SVG jest bardzo czysty inaczej i we właściwej skali (1/72 "na jednostkę)

+5

Dzięki. Co ciekawe, musiałem zrobić powyższe przed wywołaniem plt.show(). Jeśli zadzwoniłem do plt.show() przed savefig svg zakończył się jako białe tło po otwarciu w programie Illustrator – user391339

+0

@ user391339 Świetne miejsce, miałem poważny problem z pustym, białym zapisaniem, czy wiadomo, dlaczego tak się dzieje? – josh

+0

@josh to nie tylko dla SVG, zobacz tutaj: https://stackoverflow.com/questions/9012487/matplotlib-pyplot-savefig-outputs-blank-image – gidim

17

W zależności od używanego backend (testowałem na TkAgg i agg) powinno być tak proste, jak określenie go w savefig() zadzwonić:

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") 
Powiązane problemy