Matplotlib SVG: Grafik ve logoyu yol olarak koruyun
Matplotlib grafiğinizi SVG olarak dışa aktarın, ayrı logo yollarını svgutils ile birleştirin; teslim dosyasında gömülü pikselleri, yerleşimi ve yazı tipi değişikliklerini kontrol edin.
Bu sayfada
- Grafik oluşturma kaynağında nelerin bulunması gerektiğine karar verin
- Teslim edilen dosyalar ne içeriyor?
- Sınırları öngörülebilir bir grafik dışa aktarın
- Çizimi rasterleştirmeden birleştirin
- Dosyayı inceleyin, ardından bir değişikliği test edin
- Yalnızca yeniden oluşturulması gereken çizimi yeniden oluşturun
- Sık sorulan sorular
- Kaynaklar
Matplotlib figürünün içindeki bir logoyu vektör olarak korumak için grafiği SVG olarak dışa aktarın ve logonun mevcut SVG geometrisiyle birleştirin. OffsetImage ile PNG yerleştirmek, vektör grafik çizgilerinin yanında raster görüntü içeren bir SVG üretebilir. Dosya uzantısı tek başına hangi kısımların yol olduğunu söylemez.
Bu rehber bu işleri ayrı tutar: Matplotlib grafiği verilerinden çizer, svgutils ise yanına dekoratif bir amblem yerleştirir. Özgün çizim zaten vektörse onu kullanın. Yalnızca uygun bir raster illüstrasyon kalmışsa bu illüstrasyonu ayrıca yeniden oluşturun. Sayısal işaretleri, eksenleri ve etiketleri grafik oluşturma kaynağında tutun.
Kısa iş akışı
Grafiği dışa aktarın, ayrı çizimi onunla birleştirin, ortaya çıkan SVG'yi inceleyin ve ardından teslim edeceğiniz dosyanın aynısını yeniden açın. Sonraki veri güncellemesinde figürü yeniden oluşturabilmek için grafik betiğini ve çizimin ana dosyasını saklayın.
Grafik oluşturma kaynağında nelerin bulunması gerektiğine karar verin
Logo bir çizimdir; eksen üzerindeki bir ölçek işareti ise grafiğin parçasıdır. İkisini tek bir görüntü olarak ele almak sonraki değişiklikleri zorlaştırır.
| Figür içeriği | Tercih edilen kaynak | Doğrulanması gerekenler |
|---|---|---|
| Çizgiler, veri işaretçileri, eksenler ve veri etiketleri | Matplotlib grafik kodu | Değerler, etiketler ve grafik oluşturma tercihleri |
| Mevcut vektör logo veya illüstrasyon | SVG ana dosyası | Yollar, sınırlar ve bağımlılıklar |
| Raster fotoğraf veya mikroskopi paneli | Özgün raster görüntü | Son boyuttaki çözünürlük |
| Vektör kaynağı kaybolmuş basit dekoratif motif | Ayrı olarak incelenmiş bir yeniden oluşturma adayı | Şekle sadakat ve istenmeyen bölgeler |
Bazı paneller fotoğrafsa figürün tamamının vektör olması gerekmez. Bunları raster olarak koruyun. Amaç, her bileşen için doğru kaynağı tutmak ve ardından birleştirilmiş sonucu kontrol etmektir.
Matplotlib'in savefig başvuru sayfası, çıktı biçiminin açıkça seçilmesini belgeler. OffsetImage API'si, SVG yolu içe aktarıcısını değil, bir görüntü kapsayıcısını tanımlar. Dosya düzeyindeki teşhis için SVG içindeki raster görüntüleri bulma yazısına bakın.
Teslim edilen dosyalar ne içeriyor?
Örneği Python 3.12, Matplotlib 3.10.7 ve svgutils 0.3.4 ile çalıştırdık. Amblem, iki yoldan oluşan özgün bir çizimdir. Grafikteki dört değer, örnek verilerdir; bir deney veya ürün performans karşılaştırması değildir.
Karşılaştırmada her iki dosyada da aynı grafik kullanılır. Solda, OffsetImage ile 32 × 32 boyutunda bir PNG amblem eklenmiştir. Sağda, amblemin SVG yolları dışa aktarılan grafikle birleştirilmiştir. Büyütülmüş bölgeler bu gerçek teslim dosyalarından alınmıştır.

SVG öğelerini saydığımızda şu sonuçları elde ettik:
| Dosya | Image öğeleri | Path öğeleri | Text öğeleri |
|---|---|---|---|
| Yalnızca grafik | 0 | 8 | 15 |
| PNG amblemli grafik | 1 | 8 | 15 |
| SVG amblem yollarına sahip grafik | 0 | 10 | 15 |
Bu sayılar bu küçük test örneği için geçerlidir. Yol sayısı bir kalite puanı değildir ve image öğesinin bulunmaması, her SVG özelliğinin başka bir uygulamada korunacağını kanıtlamaz. Ancak bu birleştirilmiş dosyadaki amblemin gömülü PNG değil, geometri olduğunu ortaya koyar.
Sınırları öngörülebilir bir grafik dışa aktarın
Burada kullanılan sürümleri bir proje ortamına yükleyin:
python -m pip install matplotlib==3.10.7 svgutils==0.3.4Bunu plot.py olarak kaydedin ve boş bir çalışma klasöründe çalıştırın:
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)Eksenler figürün yalnızca bir bölümünü kaplar ve sağda amblem için yer bırakır. Bu dışa aktarımın viewBox değeri 0 0 432 216, dış boyutları ise 432pt × 216pt olur.
Harici çizimi yerleştirirken bu sınırları sabit tutun. savefig belgelerinde açıklandığı gibi, bbox_inches="tight" eklemek kaydedilen sınırları değiştirir. Sıkı kırpma gerekiyorsa dışa aktarılan viewBox değerini inceleyin ve ardından birleştirme koordinatlarınızı güncelleyin.
svg.fonttype="none" ayarı, örnekteki etiketleri metin olarak tutar. Matplotlib'in yazı tipi belgeleri, SVG metin ve yol çıktısı seçeneklerini açıklar. Düzenlenebilir metin için hedef ortamda hâlâ uygun bir yazı tipi gerekir. Harf şekillerinin sabit kalması gerekiyorsa yol çıktısını bilinçli olarak seçin ve etiket düzenlemeleri için grafik oluşturma kaynağını saklayın. SVG yazı tipi değişikliği rehberi, bu ödünleşimi ele alır.
Çizimi rasterleştirmeden birleştirin
Bu özgün amblemi plot.svg dosyasının yanına badge.svg olarak kaydedin:
<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>Ardından şu birleştirme betiğini çalıştırın:
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")Bu, svgutils figür birleştirme öğreticisindeki yükleme, dönüştürme, ekleme ve kaydetme yaklaşımını izler. svgutils 0.3.4 tarafından desteklenen scale_x argümanını kullandık; eski öğretici farklı bir ölçekleme argümanı gösterir.
Amblemin 100 birimlik çizimi 64 birim genişliğe iner. Sol üst köşesi, grafiğin koordinat sistemi içinde (332, 76) noktasına yerleşir. Açıkça belirtilen dış boyutlar ve viewBox, bu test örneğinde yerleşimi belirsizlikten kurtarır. Bunlar veri koordinatları değil, sayfa koordinatlarıdır: grafikte bir veri noktasını taşımak amblemi onunla birlikte taşımaz.
Değişen bir veri noktasına bağlı açıklamalar için grafiğin koordinatlarından dışa aktarılan sayfaya bilinçli bir eşleme sağlayın veya bu ilişkiyi kuran bir birleştirme aracı kullanın. Sabit sayfa yerleşimi, köşedeki bir logo veya ayrı bir illüstrasyon paneli için uygundur.
SVG ana dosyası yolların ötesinde özellikler içerebilir. Zaten PNG gömen bir SVG, birleştirildiğinde karma içerik olarak kalır. Daha karmaşık dosyaları birleştirirken başvurulan kimlikleri, yazı tiplerini ve harici bağlantılı varlıkları da kontrol edin. Bu örneğin ambleminde bu bağımlılıklar yoktur.
Dosyayı inceleyin, ardından bir değişikliği test edin
vector-logo.svg dosyasını bir tarayıcıda veya kullanmayı planladığınız düzenleyicide açın. Amblemin ortasındaki açıklığı, grafik etiketlerini ve aralarındaki boşluğu kontrol edin. Dosyayı büyüterek incelemenin yanı sıra gerçekten kullanacağınız boyutta da inceleyin.
Küçük bir XML kontrolü, önizlemeye güvenmeden yapıyı doğrulayabilir:
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)))Verilen test örneği için bu kod image 0, path 10 ve text 15 çıktısını verir. Raster karşılaştırmasında, grafiğin sekiz yolu korunurken image 1 yazdırılır. Bu karşılaştırmada görüntü başvurusu PNG verisi içerir; eksik bir harici logo dosyası değil, dosyanın içinde bulunan raster içeriktir.
Şimdi plot.py içindeki son örnek y-değerini değiştirin, betiği ve ardından birleştirmeyi yeniden çalıştırın. Amblem kendisine ayrılmış sayfa konumunda kalırken grafik değişmelidir. Bu değişiklik kontrolü, bir kez doğru görünen ancak eski bir grafik dışa aktarımına bağımlı olan iş akışını ortaya çıkarır.
Sonraki teslim adımını ayrıca kontrol edin. Figür bir belgeye yerleştirilecekse LaTeX SVG iş akışı, dışa aktarım ve etiket seçeneklerini açıklar. Başarılı bir tarayıcı önizlemesi tek başına dergi kurallarına uygunluğu veya son PDF'de korunmayı kanıtlamaz.
Yalnızca yeniden oluşturulması gereken çizimi yeniden oluşturun
Grafik kaynağı mevcutsa ondan dışa aktarın. Vektörleştirme, ekran görüntüsünden sayısal verileri veya grafik oluşturma komutlarını geri getiremez.
PerfectVector, basit bir dekoratif logo veya illüstrasyonun yalnızca raster görüntü olarak kaldığı daha dar kapsamlı durum için uygundur. Bilimsel çizimleri yeniden oluşturma iş akışında, görüntüyü yalnızca bu çizimi kapsayacak şekilde kırpın, vektör adayını önizleyin ve açıklıkları, ince şekilleri ve istenmeyen arka plan bölgelerini inceleyin. Eksenleri, ölçüm işaretlerini ve etiketleri vektörleştirmenin dışında tutun. Kabul ettiğiniz çizim SVG'sini doğrudan grafik kodundan oluşturulan grafikle birleştirin ve teslim dosyası kontrollerini tekrarlayın.
Özgün vektör ana dosyası elinizdeyse her zaman onu kullanın. Vektörleştirme önemli bir ayrıntıyı kaybettiriyorsa basit bir işareti elle yeniden çizin. Fotoğraf panellerini raster olarak tutun. Görüntü vektörleştirmeye genel bakış, bu yolu seçmeden önce vektörleştirmenin neleri geri kazanabileceğini açıklar.
Sık sorulan sorular
Matplotlib figürünü SVG olarak kaydetmek PNG logoyu vektör yapar mı? Hayır. Test edilen OffsetImage iş akışında grafik vektör geometrisi olarak dışa aktarılırken PNG logo, SVG'nin içinde bir image öğesi olarak kalır.
SVG logoyu veri koordinatlarıyla yerleştirebilir miyim? Burada gösterilen birleştirme, dışa aktarılan sayfa koordinatlarını kullanır. Bir veri noktasına bağlı logo için açık bir koordinat eşlemesi veya bu ilişkiyi koruyan bir araç gerekir.
Etiketlerim neden yollara dönüştü? Matplotlib'in SVG yazı tipi çıktı ayarı, etiketlerin metin mi yoksa glif yolları mı olarak dışa aktarılacağını kontrol eder. Dışa aktarmadan önce bu ayarı seçin ve sonraki metin değişiklikleri için grafik oluşturma kaynağını saklayın.
Kaynaklar
- Matplotlib — savefig — Açıkça SVG dışa aktarımı ve sıkı sınırlayıcı kutuların etkisi.
- Matplotlib — OffsetImage — Raster karşılaştırmasında kullanılan görüntü kapsayıcısının davranışı.
- Matplotlib — Fonts in Matplotlib — SVG metin ve glif yolu çıktı seçenekleri.
- svgutils — Creating publication-quality figures — Grafiği ayrı dışa aktarma, SVG birleştirme, dönüşümler ve birleştirilmiş figürü kaydetme.
Grafiği kodundan dışa aktarın ve çizimi ayrı tutun. Yalnızca raster bir dekoratif motif kalmışsa bir SVG çizim adayı hazırlayın, açıklıklarını ve sınırlarını inceleyin; ardından grafiğinizle birleştirip teslim edeceğiniz dosyanın aynısını pikseller, yerleşim ve etiket değişiklikleri açısından kontrol edin.
Bloga daha fazlası

jsPDF SVG: Tarayıcıda üretilen PDF’de logo yollarını koruyun
jsPDF ve svg2pdf.js ile SVG logonuzu yerleştirin, desteklenen yolları koruyun, PDF’deki boyutunu ayarlayın ve kaydedilen dosyayı aynı görselin raster dışa aktarımıyla karşılaştırın.

WPF'te SVG: Görüntüleyici veya XAML çizimi seçin
WPF'te SVG grafiklerini bir görüntüleyici, WPF’nin kendi DrawingImage nesnesi veya PNG dışa aktarımıyla kullanın. Özgün simge örneğiyle sınırları, renkleri ve bağımlılıkları kontrol edin.