2014-07-02 17 views
25

Ho bisogno di prendere l'output di un grafico matplotlib e trasformarlo in un percorso SVG che posso usare su un cutter laser.Come posso ottenere l'output di un grafico matplotlib come 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() 

Ad esempio, qui sotto si vede una forma d'onda. Mi piacerebbe essere in grado di stampare o salvare questa forma d'onda come un percorso SVG che posso poi lavorare con un programma come Adobe Illustrator.

Sono a conoscenza di una libreria SVG denominata "Cairo" che può usare matplotlib (matplotlib.use('Cairo')), tuttavia non mi è chiaro che questo mi consentirà di accedere al percorso SVG di cui ho bisogno, anche se Matplotlib utilizzerà ora Il Cairo per generare la trama.

enter image description here

Devo cairo lavorare sul mio sistema, e può disegnare con successo un esempio composta da percorsi SVG che posso effettivamente modificare in Illustrator, ma non ho un modo per prendere la mia equazione sopra in un percorso 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

(si noti che l'immagine visualizzata ecco un png, come StackOverflow non accetta grafica SVG per la visualizzazione)

risposta

35

.probabilmente voler fissare la dimensione dell'immagine e di sbarazzarsi di tutti così rts di sfondi e marcatori assi:

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

Il file SVG risultante contiene solo un elemento in più, come savefig vuole davvero salvare la figura di sfondo. Il colore di questo sfondo è facile da cambiare in "nessuno", ma non sembra essersene liberato. Comunque, l'SVG è molto pulito e nella scala corretta (1/72 "per unità)

+5

Grazie. Interessante, avevo bisogno di fare quanto sopra prima di chiamare plt.show() Se ho chiamato plt.show() prima di savefig lo svg finiva per essere solo uno sfondo bianco quando veniva aperto nell'illustrator – user391339

+0

@ user391339 Ottimo posto, stavo avendo un vero problema con il blank-white-save.È noto perché questo succede? – josh

+0

@josh questo non è solo per SVG, vedere qui: https://stackoverflow.com/questions/9012487/matplotlib-pyplot-savefig-outputs-blank-image – gidim

17

A seconda del backend si usa (ho testato su TkAgg e agg) dovrebbe essere facile come specifica all'interno del savefig() chiamano:

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