Matplotlib не может найти основные шрифты

Я использую matplotlib версии 2.0.0 на Python 3 в виртуальной среде miniconda. Я работаю над научным вычислительным кластером unix, где у меня нет привилегий root. Обычно я выполняю код python через ноутбук ipython. Если я выполняю базовую команду, например:

import matplotlib.pyplot as plt
plt.scatter([1,5], [1,5])

Появляется сообщение об ошибке:

path_to_miniconda/miniconda3/envs/conda34/lib/python3.4/site-
packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family
['sans-serif'] not found. Falling back to DejaVu Sans
(prop.get_family(), self.defaultFamily[fontext]))

Я хотел бы иметь возможность использовать шрифт Times New Roman, но даже после удаления файла кеша шрифта (fontList.py3k.cache), который я нахожу здесь:

import matplotlib as mpl
fm = mpl.font_manager
fm.get_cachedir()

Команды:

mpl.rcParams['font.family'] = ['serif']
mpl.rcParams['font.serif'] = ['Times New Roman']

не имеют эффекта, я получаю ту же ошибку, что и выше. Каталог шрифтов истинного типа:

path_to_miniconda/miniconda3/envs/conda34/Library/python3.4/сайт-пакеты/Matplotlib/MPL-данные/шрифты/TTF/

содержит только 40 шрифтов этого типа: DejaVuSerif, DejaVuSans, STIX, cmb, cmt, cmy

Любая идея, что может происходить и как я могу добавить дополнительные шрифты? Спасибо!

Ответы

Ответ 1

Эта работа для меня::

$ sudo apt-get install msttcorefonts -qq

Ответ 2

У меня была такая же проблема на Vagrant VM, работающей с 64-битным Ubuntu Xenial. Независимо от того, сколько шрифтов я уже установил, у matplotlib возникла проблема с "системным" именем шрифта "sans-serif". Я исправил его:

  • Остановка Jupyter
  • Установка диспетчера шрифтов: sudo apt install font-manager
  • Очистка каталога кеша matplotlib: rm ~/.cache/matplotlib -fr
  • Перезапуск Jupyter.

Больше сообщений об ошибках о sans-serif.

Ответ 3

Чтобы заставить его работать, мне пришлось совместить два текущих верхних ответа. Вот что сработало для меня:

$ sudo apt install msttcorefonts -qq
$ rm ~/.cache/matplotlib -rf

Ответ 4

Решение для пользователей Windows, когда появляется предупреждение:

UserWarning: findfont: Font family ['serif'] not found. Falling back to DejaVu Sans
(prop.get_family(), self.defaultFamily[fontext]))
  1. Удалите шрифты, находящиеся в кэше matplotlib.
    Расположение кэша: import matplotlib as mpl; print(mpl.font_manager.get_cachedir())

  2. Найти каталог шрифтов matplotlib. Путь может быть похож на
    C:\Miniconda3\pkgs\matplotlib-2.2.2-py36_1\Lib\site-packages\matplotlib\mpl-data\fonts\ttf

  3. Скопируйте необходимые шрифты, такие как Computer Modern, в этот каталог.

Предупреждение может сохраняться, но шрифт ваших графиков должен измениться соответствующим образом.

Ответ 5

попробуйте все вышеперечисленные методы, не работайте для меня.

мой способ решить эту проблему - это небольшая проблема с dirrent. Я использую conda на сервере ubuntu, работающем на jupyter

locate -b '\mpl-data'

найти папку

/usr/share/matplotlib/mpl-data

то я добавляю шрифты simhei в папку шрифтов в mpl-данных. затем удалите кеш шрифтов matplotlib

rm -rf ~/.cache/matplotlib

перезагрузите ноутбук jupyter, и он работает.

Ответ 6

Я столкнулся с аналогичной проблемой в докере Cloud Datalab, работающем на виртуальной машине gcloud. Выполнение следующего исправлено для меня:

$ sudo apt install msttcorefonts -qq
$ rm ~/.cache/matplotlib -rf

Ниже приведены инструкции о том, как добраться до изображения докеров, запущенного на виртуальной машине gcloud, содержащей экземпляр Datalab, на всякий случай.

Ответ 7

Я исправил это, установив параметр pyplot:

import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'serif'

так что вы можете использовать шрифты (Helvetica, Times New Roman), как показано ниже:

ax.set_title('your_title_text',fontname="Times New Roman", fontsize=20)

Ответ 8

Я нахожусь в macOS с ноутбуком Jupyter, я решил следующее: сначала закройте свой ноутбук Jupyter. Затем найдите путь к шрифту, выполнив следующие действия в Python

import matplotlib
print(matplotlib.matplotlib_fname())

для меня он печатает /Users/zyy/anaconda2/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc, обратите внимание, matplotlibrc - это файл, а не каталог.

Затем загрузите шрифт SimHei и скопируйте его в каталог fonts/ttf в каталоге mpl-data/ выше.

Удалите каталог ~/.cache/matplotlib и перезапустите ноутбук Jupyter, все должно быть хорошо.

Ответ 9

Мне потребовалось много часов, чтобы наконец понять, что мне нужно обновить matplotlib.

Моя оригинальная версия 3.0.3 (которая шла вместе с моим изображением докера jupyter-datascience) выдала бы мне эту ошибку, но обновление до 3.1.1 исправило ее.

В конце концов, мой докер-скрипт:

RUN pip install matplotlib==3.1.1
COPY fonts /usr/share/fonts/truetype/
RUN fc-cache -fv
RUN rm /home/jovyan/.cache/matplotlib -rf

это то, что сделал это для меня.