Подтвердить что ты не робот

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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