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 gambar | Sumber yang disarankan | Hal yang perlu diverifikasi |
|---|---|---|
| Garis, marker, sumbu, dan label data | Kode plot Matplotlib | Nilai, label, dan pilihan penggambaran plot |
| Logo atau ilustrasi vektor yang sudah ada | Master SVG-nya | Path, batas, dan dependensi |
| Foto raster atau panel mikroskopi | Gambar raster asli | Resolusi pada ukuran akhir |
| Motif dekoratif sederhana yang sumber vektornya hilang | Kandidat rekonstruksi yang diperiksa terpisah | Kesetiaan 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.

Penghitungan elemen SVG memberikan hasil berikut:
| File | Elemen image | Elemen path | Elemen text |
|---|---|---|---|
| Plot saja | 0 | 8 | 15 |
| Plot dengan lencana PNG | 1 | 8 | 15 |
| Plot dengan path lencana SVG | 0 | 10 | 15 |
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.4Simpan 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
- Matplotlib — savefig — Ekspor SVG eksplisit dan efek bounding box yang rapat.
- Matplotlib — OffsetImage — Perilaku wadah gambar yang digunakan untuk perbandingan raster.
- Matplotlib — Font dalam Matplotlib — Pilihan keluaran teks SVG dan path glif.
- 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

SVG jsPDF: Pertahankan Path Logo dalam PDF Buatan Browser
Gunakan svg2pdf.js dengan jsPDF untuk menempatkan logo SVG, mempertahankan path yang didukung, mengatur ukuran PDF-nya, dan memeriksa file tersimpan terhadap ekspor raster artwork tersebut.

SVG dalam WPF: Pilih Renderer atau Drawing XAML
Gunakan artwork SVG dalam WPF dengan renderer, DrawingImage native, atau ekspor PNG. Ikuti contoh ikon orisinal dan periksa batas, warna, serta dependensi.