Affichage des caractères chinois dans Matplotlib

Matplotlib n'est pas particulièrement adapté à l'affichage du chinois. Pour afficher du chinois dans Matplotlib, nous pouvons utiliser deux méthodes :

  • Définir les paramètres de police de Matplotlib.
  • Télécharger et utiliser une bibliothèque de polices prenant en charge le chinois.

Sans définir de police, l'affichage par défaut est le suivant, et la partie en chinois ne peut pas s'afficher normalement :


Paramètres de police de Matplotlib

Nous pouvons d'abord obtenir la liste des bibliothèques de polices du système :

Exemple

from matplotlib import pyplot as plt
import matplotlib
a=sorted([f.name for f in matplotlib.font_manager.fontManager.ttflist])

for i in a:
    print(i)

Le résultat de sortie est similaire à ce qui suit :

...
Heiti TC
Helvetica
Helvetica Neue
Herculanum
Hiragino Maru Gothic Pro
Hiragino Mincho ProN
Hiragino Sans
Hiragino Sans GB
Hoefler Text
...

Le code ci-dessus affiche tous les noms enregistrés dans ttflist de font_manager. Trouvez une police chinoise telle que STFangsong (FangSong) ou Heiti TC (Heiti), puis ajoutez le code suivant.

Pour Windows :

plt.rcParams['font.family'] = 'SimHei'  # 替换为你选择的字体

Sous Windows, sélectionnez SimHei (Heiti) ou une autre police chinoise, et définissez-la comme police par défaut de Matplotlib.

Pour Linux :

plt.rcParams['font.family'] = 'WenQuanYi Micro Hei'  # 替换为你选择的字体

Sous Linux, utilisez la commande fc-list pour afficher les polices installées, choisissez une police chinoise, et définissez-la comme police par défaut de Matplotlib.

Pour macOS :

plt.rcParams['font.family'] = 'Heiti TC'  # 替换为你选择的字体

En définissantplt.rcParams['font.family'], vous indiquez à Matplotlib d'utiliser la police sélectionnée pour le rendu du texte, ce qui permet d'afficher correctement les caractères chinois dans le graphique.

De cette façon, vous pouvez utiliser les polices chinoises prises en charge par le système dans les graphiques Matplotlib.

Exemple

import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'Heiti TC'  # Remplacez par la police que vous avez choisie

# Créer des données
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

# Tracer un graphique en courbes
plt.plot(x, y)

# Ajouter un titre et des étiquettes
plt.title('Exemple de graphique en courbes')
plt.xlabel('Axe X')
plt.ylabel('Axe Y')

# Afficher le diagramme
plt.show()

Ensuite, le chinois peut s'afficher normalement, comme indiqué ci-dessous :

Méthode universelle pour différents systèmes de plateformes :

# -------------------------- 设置中文字体 start --------------------------
plt.rcParams['font.sans-serif'] = [
    # Windows 优先
    'SimHei', 'Microsoft YaHei',
    # macOS 优先
    'PingFang SC', 'Heiti TC',
    # Linux 优先
    'WenQuanYi Micro Hei', 'DejaVu Sans'
]
# 修复负号显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False
# -------------------------- 设置中文字体 end --------------------------

Exemple

import numpy as np
import matplotlib.pyplot as plt

# -------------------------- Début de configuration de la police chinoise --------------------------
plt.rcParams['font.sans-serif'] = [
    # Windows en premier
    'SimHei', 'Microsoft YaHei',
    # macOS en premier
    'PingFang SC', 'Heiti TC',
    # Linux d'abord
    'WenQuanYi Micro Hei', 'DejaVu Sans'
]
# Corriger le problème d'affichage du signe négatif sous forme de carré
plt.rcParams['axes.unicode_minus'] = False
# -------------------------- Fin de la configuration de la police chinoise --------------------------

# Générer des données simulées : ajouter un peu de bruit aléatoire sur la courbe sinusoïdale
np.random.seed(42)
X = np.linspace(0, 10, 20)
y_true = np.sin(X)                     # Le véritable motif sous-jacent (que nous ne connaissons pas)
y_noise = np.random.randn(20) * 0.3   # Bruit aléatoire
y = y_true + y_noise                  # Les données que nous observons réellement

plt.scatter(X, y, label='Données observées (avec bruit)', color='blue', alpha=0.6)
plt.plot(X, y_true, label='Motif réel (y=sin(x))', color='green', linewidth=2)
plt.xlabel('X')
plt.ylabel('y')
plt.title('Données et motif sous-jacent')
plt.legend()
plt.grid(True)
plt.show()

Notre objectif est de trouver une courbe (modèle) qui décrit le mieux le motif reflété par ces points de dispersion bleus (données).

Le degré auquel le modèle décrit les données est appeléajustement。


Utilisation d'une bibliothèque de polices

Matplotlib ne prend pas en charge le chinois par défaut. Nous pouvons utiliser la méthode simple suivante pour résoudre ce problème.

Ici, nous utilisons Source Han Sans, une police open source lancée par Adobe et Google.

Site officiel :https://source.typekit.com/source-han-serif/cn/

Adresse GitHub :https://github.com/adobe-fonts/source-han-sans/tree/release/OTF/SimplifiedChinese

Après avoir ouvert le lien, il suffit d'en choisir un :

Vous pouvez également télécharger depuis le cloud drive :https://pan.baidu.com/s/10-w1JbXZSnx3Tm6uGpPGOw, code d'extraction :yxqu。

Vous pouvez télécharger une police OTF, telle que SourceHanSansSC-Bold.otf, et placer le fichier dans le même répertoire que le fichier de code en cours d'exécution :

Placez le fichier SourceHanSansSC-Bold.otf dans le même répertoire que le fichier de code en cours d'exécution :

Exemple

import numpy as np from matplotlib import pyplot as plt import matplotlib # fname est le chemin vers la bibliothèque de polices que vous avez téléchargée ; notez le chemin de la police SourceHanSansSC-Bold.otf zhfont1 = matplotlib.font_manager.FontProperties(fname="SourceHanSansSC-Bold.otf") x = np.arange(1,11) y = 2 * x + 5 plt.title("Exemple de tutoriel - Test", fontproperties=zhfont1) # fontproperties définit l'affichage du chinois, fontsize définit la taille de police plt.xlabel("axe des x", fontproperties=zhfont1) plt.ylabel("axe des y", fontproperties=zhfont1) plt.plot(x,y) plt.show()

La sortie après exécution est présentée ci-dessous :

Autres extensions