python - plots - ¿Cómo puedo obtener el resultado de un gráfico matplotlib como un SVG?
save in matplotlib (2)
Dependiendo del back-end que use (probé en TkAgg y Agg) debería ser tan fácil como especificarlo dentro de la llamada a 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")
Necesito tomar el resultado de un gráfico matplotlib y convertirlo en un camino SVG que pueda usar en un cortador láser.
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()
Por ejemplo, a continuación, verá una forma de onda. Me gustaría poder mostrar o guardar esta forma de onda como una ruta SVG con la que luego puedo trabajar en un programa como Adobe Illustrator.
Conozco una biblioteca SVG llamada "Cairo" que matplotlib puede usar ( matplotlib.use(''Cairo'')
), sin embargo, no tengo claro que esto me dará acceso a la ruta SVG que necesito, aunque matplotlib ahora usa Cairo para generar la trama.
Tengo a cairo trabajando en mi sistema, y puedo dibujar con éxito un ejemplo compuesto por rutas SVG que puedo editar en Illustrator, pero no tengo una forma de llevar mi ecuación a una ruta 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()
(Tenga en cuenta que la imagen que se muestra aquí es una png, ya que stackoverflow no acepta gráficos svg para mostrar)
Lo más probable es que desee corregir el tamaño de la imagen y deshacerse de todo tipo de fondos y marcadores de ejes:
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* np.pi * x)
plt.plot(y)
plt.axis(''off'')
plt.gca().set_position([0, 0, 1, 1])
plt.savefig("test.svg")
El archivo SVG resultante contiene solo un elemento extra, ya que savefig
realmente quiere guardar el fondo de la figura. El color de este fondo es fácil de cambiar a ''ninguno'', pero no parece deshacerse de él. De todos modos, el SVG está muy limpio de lo contrario y en la escala correcta (1/72 "por unidad).