PerfectVector
Oleh Irene Kim8 menit baca

SVG Matplotlib: Pertahankan Plot dan Logo sebagai Path

Ekspor plot Matplotlib sebagai SVG, susun path logo terpisah dengan svgutils, lalu periksa piksel tertanam, penempatan, dan perubahan font pada file akhir.

Di halaman ini

Untuk mempertahankan logo sebagai vektor dalam gambar Matplotlib, ekspor plot sebagai SVG lalu gabungkan dengan geometri SVG logo yang sudah ada. Menempatkan PNG dengan OffsetImage dapat menghasilkan SVG yang berisi gambar raster di samping garis plot vektor. Ekstensi saja tidak memberi tahu bagian mana yang berupa path.

Panduan ini memisahkan pekerjaan tersebut: Matplotlib menggambar plot dari datanya, dan svgutils menempatkan lencana dekoratif di sampingnya. Jika karya asli sudah berupa vektor, gunakan file itu. Jika hanya ilustrasi raster yang sesuai yang tersisa, rekonstruksikan ilustrasi tersebut secara terpisah. Pertahankan penanda numerik, sumbu, dan label dalam sumber plot.

Alur singkat

Ekspor plot, susun karya terpisah, periksa SVG yang dihasilkan, lalu buka kembali file persis yang akan Anda serahkan. Simpan skrip plot dan master karya agar revisi data berikutnya dapat menghasilkan ulang gambar.

Pilih bagian yang harus ada dalam sumber plot

Logo adalah karya gambar; tanda skala sumbu merupakan bagian dari plot. Memperlakukan keduanya sebagai satu gambar mempersulit revisi berikutnya.

Isi gambarSumber yang disarankanHal yang perlu diverifikasi
Garis, marker, sumbu, dan label dataKode plot MatplotlibNilai, label, dan pilihan penggambaran plot
Logo atau ilustrasi vektor yang sudah adaMaster SVG-nyaPath, batas, dan dependensi
Foto raster atau panel mikroskopiGambar raster asliResolusi pada ukuran akhir
Motif dekoratif sederhana yang sumber vektornya hilangKandidat rekonstruksi yang diperiksa terpisahKesetiaan bentuk dan wilayah yang tidak diinginkan

Gambar tidak harus seluruhnya vektor jika beberapa panel berupa foto. Pertahankan foto sebagai raster. Tujuannya adalah menyimpan sumber yang tepat untuk setiap komponen, lalu memeriksa hasil gabungannya.

Referensi savefig Matplotlib mendokumentasikan pemilihan format keluaran secara eksplisit. API OffsetImage-nya menjelaskan wadah gambar, bukan pengimpor path SVG. Untuk diagnosis pada tingkat file, lihat cara menemukan gambar raster di dalam SVG.

Isi file yang diserahkan

Kami menjalankan contoh dengan Python 3.12, Matplotlib 3.10.7, dan svgutils 0.3.4. Lencana adalah gambar asli dengan dua path. Empat nilai yang diplot merupakan data ilustratif, bukan eksperimen atau benchmark produk.

Perbandingan memakai plot yang sama dalam kedua file. Di kiri, lencana PNG berukuran 32 × 32 dimasukkan dengan OffsetImage. Di kanan, path SVG-nya digabungkan dengan plot yang diekspor. Wilayah yang diperbesar berasal dari file akhir yang sebenarnya.

File SVG Matplotlib nyata dengan wilayah lencana yang diperbesar: lencana PNG tertanam di kiri dan path lencana SVG yang digabungkan di kanan
Plot tetap vektor dalam kedua file. Dalam contoh ini, versi raster berisi satu elemen image; versi gabungan menambahkan dua path karya dan tidak berisi elemen image.

Penghitungan elemen SVG memberikan hasil berikut:

FileElemen imageElemen pathElemen text
Plot saja0815
Plot dengan lencana PNG1815
Plot dengan path lencana SVG01015

Jumlah ini berlaku untuk contoh kecil ini. Jumlah path bukan skor kualitas, dan tidak adanya elemen image tidak membuktikan setiap fitur SVG akan bertahan dalam aplikasi lain. Namun, ini membuktikan bahwa lencana dalam file gabungan tersebut adalah geometri, bukan PNG tertanam.

Ekspor plot dengan batas yang dapat diprediksi

Instal versi yang digunakan di sini dalam lingkungan proyek:

python -m pip install matplotlib==3.10.7 svgutils==0.3.4

Simpan sebagai plot.py dan jalankan dalam folder kerja kosong:

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
 
plt.rcParams["svg.fonttype"] = "none"
 
fig = plt.figure(figsize=(6, 3), dpi=72)
ax = fig.add_axes([0.14, 0.22, 0.58, 0.65])
ax.plot([0, 1, 2, 3], [1, 2, 1.5, 3],
        marker="o", color="#173b40")
ax.set(xlabel="Example x", ylabel="Example y",
       title="Illustrative data only")
ax.spines[["top", "right"]].set_visible(False)
fig.savefig("plot.svg", format="svg")
plt.close(fig)

Sumbu hanya menempati sebagian gambar, menyisakan ruang untuk lencana di kanan. Ekspor ini memiliki viewBox 0 0 432 216, dengan dimensi luar 432pt kali 216pt.

Pertahankan batas tersebut saat menempatkan karya eksternal. Menambahkan bbox_inches="tight" mengubah batas yang disimpan, sebagaimana dijelaskan dalam dokumentasi savefig. Jika Anda memerlukan pemotongan rapat, periksa viewBox yang diekspor dan perbarui koordinat komposisi setelahnya.

Pengaturan svg.fonttype="none" mempertahankan label contoh sebagai teks. Dokumentasi font Matplotlib menjelaskan pilihan keluaran teks dan path SVG. Teks yang tetap berupa teks masih memerlukan font yang sesuai dalam lingkungan penerima. Jika Anda memerlukan bentuk huruf yang tetap, pilih keluaran path dengan sengaja dan simpan sumber plot untuk menyunting label. Panduan perubahan font SVG membahas kompromi tersebut.

Gabungkan karya tanpa merasterkannya

Simpan lencana asli ini sebagai badge.svg di samping plot.svg:

<svg xmlns="http://www.w3.org/2000/svg"
     width="100" height="100" viewBox="0 0 100 100">
  <path fill="#173b40" fill-rule="evenodd"
        d="M30 5H70L95 30V70L70 95H30L5 70V30Z
           M34 17L17 34V66L34 83H66L83 66V34L66 17Z"/>
  <path fill="#28bfa3" d="M53 23L30 55H47L43 77L70 43H53Z"/>
</svg>

Lalu jalankan skrip komposisi ini:

import svgutils.transform as sg
 
page = sg.SVGFigure("432pt", "216pt")
page.root.set("viewBox", "0 0 432 216")
 
chart = sg.fromfile("plot.svg").getroot()
badge = sg.fromfile("badge.svg").getroot()
badge.moveto(332, 76, scale_x=0.64)
 
page.append([chart, badge])
page.save("vector-logo.svg")

Ini mengikuti pendekatan memuat, mentransformasi, menambahkan, dan menyimpan dalam tutorial komposisi gambar svgutils. Kami memakai scale_x, argumen yang didukung svgutils 0.3.4; tutorial lama menunjukkan argumen penskalaan berbeda.

Karya lencana selebar 100 satuan menjadi 64 satuan. Sudut kiri atasnya berada di (332, 76) dalam sistem koordinat plot. Dimensi luar dan viewBox yang eksplisit membuat penempatan pada contoh ini jelas. Ini adalah koordinat halaman, bukan koordinat data: memindahkan titik data dalam plot tidak akan memindahkan lencana bersamanya.

Untuk anotasi yang terkait dengan titik data yang berubah, kelola pemetaan yang disengaja dari koordinat plot ke halaman ekspor, atau gunakan alat komposisi yang menyediakan keterkaitan itu. Penempatan halaman tetap sesuai untuk logo di sudut atau panel ilustratif terpisah.

Master SVG dapat berisi fitur selain path. SVG yang sudah menyematkan PNG tetap menjadi konten campuran ketika digabungkan. Periksa juga ID yang dirujuk, font, dan aset yang ditautkan secara eksternal ketika menggabungkan file yang lebih kompleks. Contoh ini menghindari dependensi tersebut dalam lencananya.

Periksa file, lalu uji revisi

Buka vector-logo.svg di browser atau editor yang akan Anda gunakan. Periksa bukaan tengah lencana, label plot, dan ruang kosong di antaranya. Periksa file pada ukuran penggunaan sebenarnya maupun saat diperbesar.

Pemeriksaan XML kecil dapat mengonfirmasi strukturnya tanpa mengandalkan pratinjau:

import xml.etree.ElementTree as ET
 
root = ET.parse("vector-logo.svg").getroot()
ns = "{http://www.w3.org/2000/svg}"
for tag in ("image", "path", "text"):
    print(tag, len(root.findall(".//" + ns + tag)))

Untuk contoh yang disediakan, skrip ini mencetak image 0, path 10, dan text 15. Perbandingan raster mencetak image 1, sambil mempertahankan delapan path plot. Dalam perbandingan itu, referensi image berisi data PNG; konten raster tersebut mandiri, bukan file logo eksternal yang hilang.

Sekarang ubah nilai y ilustratif terakhir dalam plot.py, jalankan ulang, lalu jalankan ulang komposisi. Plot seharusnya berubah sementara lencana tetap di posisi halaman yang disediakan. Pemeriksaan revisi itu menemukan alur yang terlihat benar sekali tetapi bergantung pada ekspor plot lama.

Periksa langkah penyerahan berikutnya secara terpisah. Jika gambar akan dimasukkan ke dokumen, alur SVG LaTeX menjelaskan pilihan ekspor dan label. Pratinjau browser yang berhasil saja tidak membuktikan kepatuhan terhadap jurnal atau bahwa hasilnya tetap terjaga dalam PDF akhir.

Rekonstruksikan hanya karya yang memerlukan rekonstruksi

Ketika sumber plot tersedia, ekspor dari sumber tersebut. Vektorisasi tidak dapat memulihkan data numerik atau perintah penggambaran plot dari tangkapan layar.

PerfectVector cocok untuk kasus yang lebih terbatas, ketika logo dekoratif atau ilustrasi sederhana hanya tersisa sebagai gambar raster. Dengan alur rekonstruksi karya ilmiahnya, potong hingga hanya karya itu, pratinjau kandidat vektor, lalu periksa bukaan, bentuk tipis, dan wilayah latar yang tidak diinginkan. Jangan sertakan sumbu, penanda pengukuran, dan label dalam tracing. Gabungkan SVG karya yang diterima dengan plot asli, lalu ulangi pemeriksaan file akhir.

Gunakan master vektor asli kapan pun tersedia. Gambar ulang tanda sederhana secara manual ketika tracing menghilangkan detail penting. Pertahankan panel foto sebagai raster. Ikhtisar vektorisasi gambar menjelaskan apa yang bisa direkonstruksi tracing sebelum Anda memilih jalur tersebut.

FAQ

Apakah menyimpan gambar Matplotlib sebagai SVG membuat logo PNG menjadi vektor? Tidak. Dalam alur OffsetImage yang diuji, plot diekspor sebagai geometri vektor sedangkan logo PNG tetap menjadi elemen image di dalam SVG.

Bisakah saya menempatkan logo SVG memakai koordinat data? Komposisi yang ditunjukkan di sini memakai koordinat halaman hasil ekspor. Logo yang terikat pada titik data memerlukan pemetaan koordinat eksplisit atau alat yang mempertahankan keterkaitan itu.

Mengapa label saya menjadi path? Pengaturan keluaran font SVG Matplotlib menentukan apakah label diekspor sebagai teks atau path glif. Pilih pengaturan itu sebelum mengekspor, dan simpan sumber plot untuk perubahan kata-kata berikutnya.

Sources

  1. Matplotlib — savefig — Ekspor SVG eksplisit dan efek bounding box yang rapat.
  2. Matplotlib — OffsetImage — Perilaku wadah gambar yang digunakan untuk perbandingan raster.
  3. Matplotlib — Font dalam Matplotlib — Pilihan keluaran teks SVG dan path glif.
  4. svgutils — Membuat gambar berkualitas publikasi — Ekspor plot terpisah, komposisi SVG, transformasi, dan penyimpanan gambar gabungan.

Ekspor plot dari kodenya dan simpan karya secara terpisah. Jika hanya motif dekoratif raster yang tersisa, siapkan kandidat karya SVG, periksa bukaan dan batasnya, lalu gabungkan dengan plot Anda dan periksa file persis yang diserahkan untuk menemukan piksel, masalah penempatan, dan perubahan label.

Lebih banyak dari blog

Mulai dengan SVG yang lebih rapi
dan lebih mudah diedit