[解決済み] matplotlib のプロットの出力を SVG として取得するにはどうしたらいいですか?
2023-01-12 14:18:22
質問
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')
という SVG ライブラリを知っていますが、matplotlib がプロットを生成するために Cairo を使用しているにもかかわらず、このライブラリによって私が必要とする SVG パスにアクセスできるかどうかは、私には明らかではありません。
私のシステムでは 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()
<イグ
(ここで表示される画像はpngであることに注意してください。stackoverflowは表示用のsvgグラフィックを受け付けないからです)
どのように解決するのですか?
画像サイズを固定し、あらゆる種類の背景や軸マーカーを取り除くことが最も重要でしょう。
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ファイルには、余分な要素が1つだけ含まれています。
savefig
は本当に図の背景を保存したいのです。この背景の色は 'none' に変更するのは簡単ですが、取り除くことはできないようです。とにかく、SVG はそれ以外は非常にきれいで、正しいスケール (単位は 1/72") になっています。
関連
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] リストの最後の要素を取得する方法
-
[解決済み] Matplotlibでプロットを表示するのではなく、画像ファイルに保存する。
-
[解決済み] print関数の出力をフラッシュする(pythonの出力をバッファリング解除する)にはどうすればよいですか?
-
[解決済み] Matplotlib で凡例をプロットの外側に配置する方法
-
[解決済み] IPythonノートブックmatplotlibプロットをインラインで行う方法
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] Pythonの文字列の前にあるbという接頭辞は何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Matplotlib (pyplot) の savefig が空白の画像を出力する
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] Python Empty Generator 関数