Отображение китайского языка в Matplotlib

Matplotlib не особенно дружелюбен к отображению китайского языка. Чтобы отображать китайский в Matplotlib, можно использовать два метода:

  • Задайте параметры шрифта Matplotlib.
  • Скачайте и используйте библиотеку шрифтов, поддерживающую китайский язык.

Без настройки шрифта отображение по умолчанию выглядит следующим образом, и китайская часть не может отображаться нормально:


Параметры шрифта Matplotlib

Сначала можно получить список шрифтов системы:

Пример

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)

Результат вывода аналогичен следующему:

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

Приведённый выше код выводит все зарегистрированные имена в ttflist из font_manager. Найдите китайский шрифт, например STFangsong (FangSong) или Heiti TC (Heiti), затем добавьте следующий код.

Для Windows:

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

В Windows выберите SimHei (Heiti) или другой китайский шрифт и установите его в качестве шрифта Matplotlib по умолчанию.

Для Linux:

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

В Linux используйте команду fc-list для просмотра установленных шрифтов, выберите китайский шрифт и установите его в качестве шрифта Matplotlib по умолчанию.

Для macOS:

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

Устанавливаяplt.rcParams['font.family'], вы указываете Matplotlib использовать выбранный шрифт для отображения текста, благодаря чему китайский правильно отображается на графике.

Таким образом, вы можете использовать поддерживаемые системой китайские шрифты на графиках Matplotlib.

Пример

import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'Heiti TC'  # Замените на выбранный вами шрифт

# Создание данных
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

# Построить линейный график
plt.plot(x, y)

# Добавить заголовок и подписи осей
plt.title('Пример линейного графика')
plt.xlabel('Ось X')
plt.ylabel('Ось Y')

# Отобразить график
plt.show()

Тогда китайский будет отображаться нормально, как показано ниже:

Универсальный метод для различных платформ:

# -------------------------- 设置中文字体 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 --------------------------

Пример

import numpy as np
import matplotlib.pyplot as plt

# -------------------------- Начало настройки китайского шрифта --------------------------
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
# -------------------------- Конец настройки китайского шрифта --------------------------

# Сгенерировать имитированные данные: добавить немного случайного шума поверх синусоиды
np.random.seed(42)
X = np.linspace(0, 10, 20)
y_true = np.sin(X)                     # Истинная базовая закономерность (которая нам неизвестна)
y_noise = np.random.randn(20) * 0.3   # Случайный шум
y = y_true + y_noise                  # Данные, которые мы фактически наблюдаем

plt.scatter(X, y, label='Наблюдаемые данные (с шумом)', color='blue', alpha=0.6)
plt.plot(X, y_true, label='Истинная закономерность (y=sin(x))', color='green', linewidth=2)
plt.xlabel('X')
plt.ylabel('y')
plt.title('Данные и лежащая в основе закономерность')
plt.legend()
plt.grid(True)
plt.show()

Наша цель — найти кривую (модель), которая наилучшим образом описывает закономерность, отражённую этими синими точками диаграммы рассеяния (данными).

Степень, в которой модель описывает данные, называетсяаппроксимацией。


Использование библиотеки шрифтов

Matplotlib по умолчанию не поддерживает китайский язык. Мы можем использовать следующий простой метод, чтобы решить эту проблему.

Здесь мы используем Source Han Sans — шрифт с открытым исходным кодом, выпущенный Adobe и Google.

Официальный сайт:https://source.typekit.com/source-han-serif/cn/

Адрес GitHub:https://github.com/adobe-fonts/source-han-sans/tree/release/OTF/SimplifiedChinese

После открытия ссылки просто выберите один внутри:

Вы также можете скачать с облачного диска:https://pan.baidu.com/s/10-w1JbXZSnx3Tm6uGpPGOw, код извлечения:yxqu。

Вы можете скачать шрифт OTF, например SourceHanSansSC-Bold.otf, и поместить файл в тот же каталог, что и текущий исполняемый файл кода:

Поместите файл SourceHanSansSC-Bold.otf в тот же каталог, что и текущий исполняемый файл кода:

Пример

import numpy as np from matplotlib import pyplot as plt import matplotlib # fname — это путь к библиотеке шрифтов, которую вы скачали; обратите внимание на путь к шрифту SourceHanSansSC-Bold.otf zhfont1 = matplotlib.font_manager.FontProperties(fname="SourceHanSansSC-Bold.otf") x = np.arange(1,11) y = 2 * x + 5 plt.title("Пример руководства — Тест", fontproperties=zhfont1) # fontproperties задаёт отображение китайского текста, fontsize задаёт размер шрифта plt.xlabel("ось X", fontproperties=zhfont1) plt.ylabel("ось Y", fontproperties=zhfont1) plt.plot(x,y) plt.show()

Вывод после выполнения показан ниже:

Другие расширения