2014-07-02 7 views
25

Ich muss die Ausgabe eines Matplotlib-Plots nehmen und es in einen SVG-Pfad verwandeln, den ich auf einem Laserschneider verwenden kann.Wie kann ich die Ausgabe eines Matplotlib-Plots als SVG erhalten?

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

Zum Beispiel unten sehen Sie eine Wellenform. Ich möchte in der Lage sein, diese Wellenform als SVG-Pfad auszugeben oder zu speichern, mit dem ich später in einem Programm wie Adobe Illustrator arbeiten kann.

Ich kenne eine SVG-Bibliothek namens "Cairo", die Matplotlib verwenden kann (matplotlib.use('Cairo')), aber es ist mir nicht klar, dass dies mir Zugang zu dem SVG-Pfad geben wird, den ich brauche, obwohl Matplotlib jetzt verwenden wird Kairo, um das Grundstück zu generieren.

enter image description here

ich kairo habe auf meinem System zu arbeiten, und kann erfolgreich ein Beispiel bestand aus SVG Pfaden zeichnen, die ich in Illustrator tatsächlich bearbeiten kann, aber ich weiß nicht, einen Weg, um meine Gleichung zu nehmen oben in ein SVG-Pfad

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

(beachten Sie, dass das Bild, das hier angezeigt ist ein png, wie Stackoverflow SVG-Grafiken für die Anzeige nicht akzeptiert)

Antwort

35

Sie werden höchstwahrscheinlich die Bildgröße fixieren wollen und so alle loswerden rts von Hintergründen und Achsenmarkierungen:

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

Die resultierende SVG-Datei enthält nur ein zusätzliches Element, wie savefig wirklich will die Figur Hintergrund speichern. Die Farbe dieses Hintergrunds lässt sich leicht auf "none" ändern, aber es scheint nicht los zu werden. Wie auch immer, das SVG ist ansonsten sehr sauber und im richtigen Maßstab (1/72 "pro Einheit).

+5

Danke. Interessanterweise musste ich das obige tun, bevor ich plt.show() anrief. Wenn ich plt.show() anrief. vor savefig endete die svg nur als weißer hintergrund, wenn sie im illustrator geöffnet wurde – user391339

+0

@ user391339 Großartiger platz.Ich hatte ein echtes Problem mit dem blank-white-save.Es ist bekannt, warum das passiert? – josh

+0

@josh das ist nicht nur für SVG, siehe hier: https://stackoverflow.com/questions/9012487/matplotlib-pyplot-savefig-outputs-blank-image – gidim

17

Je nach Backend Sie verwenden (ich auf TkAgg getestet und Agg) es sollte so einfach sein, wie es in der savefig Angabe() aufrufen:

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