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などのプログラムで使用できるようにしたいと思います。
Matplotlibが使用できる「Cairo」と呼ばれるSVGライブラリ(matplotlib.use('Cairo')
)を知っていますが、matplotlibが必要なSVGパスにアクセスできるかどうかは明確ではありませんCairoを使用してプロットを生成します。
私のシステムではcairoが動作しており、Illustratorで実際に編集できるSVGパスで構成された例を正常に描画できますが、上記の式を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()
_
(stackoverflowは表示用のsvgグラフィックを受け入れないため、ここに表示される画像はpngであることに注意してください)
ほとんどの場合、画像サイズを修正し、あらゆる種類の背景と軸マーカーを取り除きます。
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")
savefig
は実際にFigureの背景を保存するため、結果のSVGファイルには追加要素が1つだけ含まれます。この背景の色は「なし」に変更するのは簡単ですが、それを取り除くことはないようです。とにかく、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")