Как изменить шрифты в matplotlib (python)?


89

Это звучит как простая проблема, но я не нахожу эффективного решения для изменения шрифта (а не размера шрифта) в графике, созданном с помощью matplotlib в python.

Я нашел несколько руководств по изменению шрифта по умолчанию для matplotlib путем изменения некоторых файлов в папках, где matplotlib хранит свой шрифт по умолчанию - см. Это сообщение в блоге - но я ищу менее радикальное решение, так как я хотел бы использовать более одного шрифт в моем сюжете (текст, метка, метка оси и т. д.).


Рад, что помог :) Можете выложить код, вызывающий эту ошибку? Я сам не видел этой ошибки, но вот несколько ссылок, которые могут вам помочь. matplotlib.1069221.n5.nabble.com/… matplotlib.1069221.n5.nabble.com/Fonts-not-found-td12936.html
aidnani8

Код, который создает проблему: hfont = {'fontname':'Helvetica'} plt.annotate('Country ', (0.17,0.95), xytext=None, xycoords='figure fraction',size=28, color='red', horizontalalignment = 'left', **hfont)и ошибка /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/m‌​atplotlib/font_manager.py:1236: UserWarning: findfont: Font family ['Helvetica'] not found. Falling back to Bitstream Vera Sans (prop.get_family(), self.defaultFamily[fontext]))вместо этого, если я использую в качестве имени шрифта Comic Sans MS, как в вашем примере, код работает.
SirC

Ответы:


103

Скажем, вы хотите Comic Sans для названия и Helvetica для метки x.

csfont = {'fontname':'Comic Sans MS'}
hfont = {'fontname':'Helvetica'}

plt.title('title',**csfont)
plt.xlabel('xlabel', **hfont)
plt.show()

1
Я пробовал и работает! Это именно то, что я искал. Тем не менее, для некоторых шрифтов у меня есть следующее сообщение об ошибке (не для всех): /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/font_manager.py:1236: UserWarning: findfont: Font family ['Helvetica'] not found. Falling back to Bitstream Vera Sans (prop.get_family(), self.defaultFamily[fontext])). Как установить Helvetica в набор шрифтов, известных matplotlib?
SirC

4
найдите файл fontList.cache, вы можете использовать только те, которые там перечислены. В качестве альтернативы посмотрите здесь stackoverflow.com/questions/20206906/…
Б.Коцис

3
продолжение вышеупомянутого комментария. Чтобы найти свой файл fontList.cache, используйте matplotlib.get_cachedir ()
CS,

51

Вы также можете использовать rcParamsдля глобального изменения семейства шрифтов.

 import matplotlib.pyplot as plt
 plt.rcParams["font.family"] = "cursive"
 # This will change to your computer's default cursive font

Список аргументов семейства шрифтов matplotlib находится здесь .


23

Я предпочитаю нанимать:

from matplotlib import rc
#rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})
rc('font',**{'family':'serif','serif':['Times']})
rc('text', usetex=True)

Отличный способ изменить шрифт глобально, я это искал. Последняя строка не обязательна, не уверен, какое отношение к этому имеет Tex. Если вы получили сообщение об ошибке, потому что нужный
smcs

8
import pylab as plb
plb.rcParams['font.size'] = 12

или же

import matplotlib.pyplot as mpl
mpl.rcParams['font.size'] = 12

9
как ни странно, это именно та команда, которую я искал. определенно не то, о чем спрашивал OP
синий

2

Шрифт Helvetica не входит в состав Windows, поэтому для его использования необходимо загрузить его в виде файла .ttf. Затем вы можете сослаться на него matplotlib следующим образом (замените "crm10.ttf" своим файлом):

import os
from matplotlib import font_manager as fm, rcParams
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

fpath = os.path.join(rcParams["datapath"], "fonts/ttf/cmr10.ttf")
prop = fm.FontProperties(fname=fpath)
fname = os.path.split(fpath)[1]
ax.set_title('This is a special font: {}'.format(fname), fontproperties=prop)
ax.set_xlabel('This is the default font')

plt.show()

print(fpath) покажет вам, где вы должны поместить .ttf.

Вы можете увидеть результат здесь: https://matplotlib.org/gallery/api/font_file.html


Есть ли способ установить fontpropertiesглобально, чтобы вам не приходилось указывать его при каждом вызове, например set_title(), set_xlabel()и т. Д.?
Кайл Миллс

1
^ Чтобы ответить на мой собственный вопрос: stackoverflow.com/questions/35668219
Кайл Миллс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.