Як змінити шрифти в matplotlib (python)?


84

Це звучить як легка проблема, але я не знаходжу жодного ефективного рішення змінити шрифт (не розмір шрифту) в сюжеті, зробленому за допомогою 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

Відповіді:


98

Скажімо, ви хочете 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 / ...
B.Kocis

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

48

Ви також можете використовувати rcParamsглобальну зміну сімейства шрифтів.

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

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


19

Я волію наймати:

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

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

або

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

9
неймовірно досить, це саме та команда, яку я шукав. точно не те, що просив ОП, хоча
синій

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()і т.д.?
Kyle Mills

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