Как я могу получить вывод графика matplotlib как SVG?

мне нужно взять вывод графика matplotlib и превратить его в путь 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()

например, ниже вы видите форму сигнала. Я хотел бы иметь возможность выводить или сохранять эту форму волны как путь SVG, с которым я могу позже работать в такой программе, как Adobe Illustrator.

Я знаю о библиотеке SVG под названием "Cairo", которую matplotlib может использовать (matplotlib.use('Cairo')), однако мне не ясно, что это даст мне доступ к пути SVG что мне нужно, хотя библиотек matplotlib теперь будет через Каир для создания сюжета.

enter image description here

у меня есть cairo, работающий над моей системой, и я могу успешно нарисовать пример, состоящий из путей SVG, которые я действительно могу редактировать в Illustrator, но у меня нет способа взять мое уравнение выше в путь 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

(обратите внимание, что изображение, отображаемое здесь, является png, поскольку stackoverflow не принимает графику svg для отображения)

2 ответов


вы, скорее всего, захотите исправить размер изображения и избавиться от всех видов фонов и маркеров оси:

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

полученный файл SVG содержит только один дополнительный элемент, как savefig действительно хочет сохранить фигуру фона. Цвет этого фона легко изменить на "нет", но он, похоже, не избавляется от него. Во всяком случае, SVG очень чистый в противном случае и в правильном масштабе (1/72" на единицу).


в зависимости от используемого вами бэкэнда (я тестировал на TkAgg и Agg) это должно быть так же просто, как указать его в вызове 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")