¿Cómo puedo obtener la salida de un matplotlib trama como un SVG?

Necesito tomar la salida de un matplotlib parcela y convertirlo en un SVG camino que puedo usar en una cortadora 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, abajo se ve una forma de onda. Me gustaría ser capaz de enviar o guardar esta forma de onda como una SVG camino que me puede más tarde trabajar en un programa como Adobe Illustrator.

Soy consciente de SVG biblioteca llamada «el Cairo» que matplotlib puede utilizar (matplotlib.use('Cairo')), sin embargo no es claro para mí que esto me dará acceso a la ruta SVG que necesito, aunque matplotlib ahora va a ser el uso de el Cairo para generar la trama.

¿Cómo puedo obtener la salida de un matplotlib trama como un SVG?

Tengo el cairo trabajando en mi sistema, y capaz de dibujar un ejemplo compuesta de SVG caminos que de hecho puede editar en Illustrator, pero no tengo manera de tomar mi ecuación anterior en un SVG camino.

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

¿Cómo puedo obtener la salida de un matplotlib trama como un SVG?

(tenga en cuenta que la imagen que se muestra aquí es un png, como stackoverflow no acepta svg gráficos para la visualización)

  • era casi la derecha, agregar transparente=True
InformationsquelleAutor user391339 | 2014-07-02

2 Kommentare

  1. 58

    Lo más probable es que desee fijar el tamaño de la imagen y deshacerse de todo tipo de fondos y el eje de marcadores:

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

    La resultante archivo SVG contiene sólo un elemento más, como savefig realmente quiere salvar la figura de fondo. El color de este fondo es fácil cambiar a ‘ninguno’, pero no parece para deshacerse de él. De todos modos, el SVG es muy limpia, de lo contrario, y en la escala correcta (1/72″ por unidad).

    • Gracias. Curiosamente yo necesitaba para hacer la anterior antes de llamar plt.show(). Si me llama plt.show() antes de savefig el svg terminó siendo un fondo blanco cuando se abre en illustrator.
    • Gran lugar. Yo estaba teniendo un problema real con el espacio en blanco-blanco-guardar. Se sabe por qué sucede esto?
    • esto no es sólo para SVG. ver aquí: stackoverflow.com/questions/9012487/…
    • plt.show() borra toda la cosa, así que cualquier cosa que después va a suceder en un nuevo vacío de la figura.
    • Es allí una manera de enviar el crudo svg texto a una cadena, en lugar de tener a la salida para el sistema de ficheros?
  2. 24

    Dependiendo del backend de utilizar (he probado en TkAgg y Agg) debería ser tan fácil como se especifica en el savefig() llamada:

    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")
    • ¿Qué pasa si la figura es completamente blanco?
    • entonces no funciona. Asegúrese de utilizar savefig() inmediatamente después de la parcela(). Si usted llama después de mostrar() va a hacer una completamente blanca SVG.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea