Yayın: 14 Haziran 2024

Matplotlib'de Japonca karakterlerin düzgün görüntülenmediği bu sorunla hiç karşılaştınız mı?
Bu çirkin sorundan bahsediyorum:

Yukarıdaki grafik, başlığı, x ve y eksen etiketleri için Japonca karakterler kullanıyor. Python'da kullanılan varsayılan font Japonca karakterleri desteklemediği için, bu karakterler düzgün şekilde basılmıyor.
Program her bir karakteri basamadığında, kötü bir uyarı mesajı görüntülenir:

Bu bir programcının kabusudur.
Bu arada, yukarıdaki program aşağıdaki kod ile oluşturulmuştur.
import numpy as np
import matplotlib.pyplot as plt
rand_array = np.random.randint(10, size=20)
plt.figure(figsize=(10, 6))
plt.plot(rand_array)
plt.title("晴耕雨読")
plt.ylabel("前人未踏")
plt.xlabel("率先垂範")
plt.show()Bu sorunu çözelim.
Varsayılan font Japonca karakterleri basamadığı için, varsayılan fontu Japonca karakterleri destekleyen bir fonta değiştirmemiz gerekiyor.
Varsayılan fontun ne olduğuna bakalım:
import matplotlib
# Get font family
print(matplotlib.rcParams["font.family"])
# >> ['sans-serif']
# Get fonts within the family
matplotlib.rcParams["font.sans-serif"]
# >> ['DejaVu Sans', 'Bitstream Vera Sans', 'Computer Modern Sans Serif', 'Lucida Grande', 'Verdana', 'Geneva', 'Lucid', 'Arial', 'Helvetica', 'Avant Garde', 'sans-serif']Ne yazık ki mevcut font Japonca karakterleri desteklemiyor, ancak çözüm çok basit.
Matplotlib varsayılan olarak sans-serif font ailesini kullanırken,
Japonca'yı destekleyenler de dahil olmak üzere birçok başka font kullanılabilir.
Bunları listeleyelim:
import matplotlib
fonts = set([f.name for f in matplotlib.font_manager.fontManager.ttflist])
len(fonts), fonts
# >> (303, {'.Aqua Kana', '.Keyboard', '.New York', '.SF Arabic', '.SF Compact', '.SF Compact Rounded', ...2021 model bir MacBook Pro kullanıyorum ve bunlar mevcut fontlar. Kullandığınız makineye bağlı olarak farklı bir font seti alabilirsiniz.
Şimdi, Matplotlib'de gerçekten Japonca'yı destekleyen fontlara bakalım:
import matplotlib
# Matplitlib gives warning when a character cannot be plotted with a font
# We need to escalate it to error so that we can catch it
import warnings
warnings.filterwarnings("error")
# Get all fonts in the OS
fonts = set([f.name for f in matplotlib.font_manager.fontManager.ttflist])
# Initialize a list where we'll keep Japanese compatible fonts
jp_compatible_fonts = []
for i, font in enumerate(fonts):
# Try plotting a text that says: XXフォントが日本語をサポートしているので、大好き!
# Fonts that don't support Japanese will give error
try:
fig = plt.figure(figsize=(0.5,0.5))
plt.text(0, 0, f"{font}フォントが日本語をサポートしているので、大好き!", fontname=font)
plt.axis('off')
plt.draw()
plt.pause(0.001)
# If successfully plotted, add it to the list
jp_compatible_fonts.append(font)
except UserWarning:
pass
# Close the figure so that incompatible font does not influence the next plot
plt.close(fig)
jp_compatible_fonts
# >> ['Apple SD Gothic Neo', 'Hiragino Mincho ProN', 'Arial Unicode MS', 'Heiti TC', 'Hiragino Maru Gothic Pro', 'Hiragino Sans GB', 'Hiragino Sans', 'PingFang HK', '.Aqua Kana']Laptopumda, Japonca'yı sorunsuzca plotlayabilen 9 font vardı:
Bu fontların Japonca'yı nasıl plotladığına bakalım:
import matplotlib
fig = plt.figure()
for i, font in enumerate(jp_compatible_fonts):
plt.text(
0,
i,
f"{font}フォントが日本語をサポートしているので、大好き!",
fontname=font,
)
plt.axis("off")
plt.ylim(0, len(jp_compatible_fonts))
plt.show()Aşağıda sonuçlar var:

Şu ana kadar, Matplotlib'deki varsayılan fontun Japonca karakterleri plotlayamadığını, ancak Japonca'yı sorunsuzca plotlayabilen 9 başka font olduğunu öğrendik. Şimdi orijinal grafiğimize geri dönelim.
Ancak, grafik oluşturmadan önce, varsayılan fontu aşağıda belirlediğimiz 9 fonttan birine değiştirelim.
Ben kişisel olarak Hiragino Sans'ı seviyorum, bu yüzden fontu
buna değiştireceğim.
import numpy as np
import matplotlib.pyplot as plt
### CHANGE THE FONT FROM DEFAULT TO HIRAGINO SANS
plt.rcParams['font.family'] = "Hiragino Sans"
rand_array = np.random.randint(10, size=20)
plt.figure(figsize=(10, 6))
plt.plot(rand_array)
plt.title("晴耕雨読")
plt.ylabel("前人未踏")
plt.xlabel("率先垂範")
plt.show()Sonuç aşağıdadır:

Japonca karakterlerin ne kadar güzel görüntülendiğini ve artık kötü bir uyarı almadığımızı seviyorum.
Bu blog yazısında, Matplotlib'deki Japonca karakter görüntüleme sorununu çözdük. Sadece bir satır daha kod ekleyerek sorunun ortadan kalktığı güzel bir çözümdür.
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = "Hiragino Sans"Önemli olan, Japonca'yı desteklemeyen varsayılan fontu kullanmayı bırakıp, gerçekten destekleyen bir fonta geçmektir. Örneğin, benim makinemde hazır bulunan Hiragino Sans gibi.
Umarım bu blog yazısını beğenmişsinizdir. Sorularınız veya yorumlarınız varsa, aşağıda bana bildirin.
Bir sonraki bildirime kadar, mutlu kodlamalar!
Bu blog İngilizce'den LLM ile çevrilmiştir. Herhangi bir belirsizlik durumunda İletişim sayfasından bana ulaşabilirsiniz.
Yorum bırak
Yorumlar
Şuan yorum yok.
Diğer bloglara bak

2025/07/07
Q-Learning: İnteraktif Pekiştirmeli Öğrenmenin Temeli

2025/07/06
Optimizasyon Algoritmaları: SGD, Momentum ve Adam

2025/07/05
Karakterlerden Kelimelere: Japonca BPE Tokenizer

2024/06/19
Svelte ve JavaScript ile Basit ve Dinamik Bir Tooltip Yaratma Yöntemi
2024/06/17
JavaScript ile Tokyo'nun İnteraktif Haritasını Oluşturun

2024/06/13
Kitap İncelemesi | Ötekiyle Konuşmak by Malcolm Gladwell

2024/06/07
Japonca'da En Sık Kullanılan 3.000 Kanji

2024/06/07
VSCode'da Regex Kullanarak Replace Yapma Yöntemi

2024/06/06
Svelte'de Readable Store Kullanmayın

2024/06/05
Dosyaları Gzip ve Pako ile Sıkıştırarak Web Sitesinin Yükleme Hızını Artırın

2024/05/31
Web Sayfasında Farenin Uzerinde Oldugu Kelimeyi JavaScript ile Bulun

2024/05/29
Svelte ve SVG ile Interaktif Harita Oluşturun

2024/05/28
Kitap İncelemesi | Geleneklere Uymayanlar Dünyayı Nasıl İleri Taşıyor? by Adam Grant & Sheryl Sandberg

2024/05/27
Javascript Kullanarak Sudoku Nasıl Çözülür?

2024/05/26
Web Siteme Gelen Trafiği Bir Ayda Nasıl 10 Kat Artırdım?

2024/05/24
Hayat Bisiklet Sürmek Gibidir
2024/05/19
JavaScript'te Backtracking Algoritması ile Tamamlanmış Sudoku Oluşturun

2024/05/16
Tailwind Neden Harikadır ve Web Geliştirmeyi Nasıl Kolay Hale Getirir?

2024/05/15
Python ve Git Hooks ile Otomatik Olarak Site Haritası Oluşturma

2024/05/14
Kitap İncelemesi | Çok Yönlü - Başarı İçin Neden Çok Şeyle İlgilenmeliyiz? by David Epstein

2024/05/13
Svelte ve SvelteKit nedir?

2024/05/12
SvelteKit ile Internationalization (Çoklu Dil Desteği)

2024/05/11
Svelte'de Caching ile Deploy Süresini Azaltın

2024/05/10
Svelte ve Intersection Oberver ile Lazy-Load

2024/05/10
Genetik Algoritma İle Hisse Senedi Portföyü Optimizasyonu

2024/05/09
ShapeFile Formatini SVG Formatina Degistirme Yontemi

2024/05/08
Svelte'de Reaktivite: Variables, Binding, ve Key Fonksiyonu

2024/05/07
Kitap İncelemesi | Savaş Sanatı - Sun Tzu

2024/05/06
Specialistlik Bitti. Yaşasın Generalistlik!

2024/05/03
2018 Milletvekili Seçimlerinde Yaşa Göre Parti Eğilimi

2024/05/01
Python Selenium Ile Secmen Veritabani Olusturma

2024/04/30
Svelte ve Tailwind Ile Infinite Scroll Yapma Yontemi

2024/04/29
1 Yıl İçerisinde Japonca Konuşabilmek

2024/04/25
Svelte ve Tailwind ile Kullanıma Hazır Web Sitesi Şablonu

2024/01/29
Tembel Muhendisler Kotu Urunler Yapar

2024/01/28
Mukemmellik Uzerine

2024/01/28
MacBook'ta PDF'i PNG'ye Cevirme Yontemi

2023/12/31
2023'u Kapatiyoruz: Bu Yil Okunan 24 Kitap

2023/12/30
Python PIL Kullarak Foto Kolaji Yapma Yontemi

2024/01/09
Site Ziyaretcilerinin Alet ve Tarayicilarini Tespit Etme Yontemi

2024/01/19
ChatGPT Cevap Anatomisi