Jak zmienić czcionki w Matplotlib (Python)?

89

Brzmi to jak łatwy problem, ale nie znajduję żadnego skutecznego rozwiązania, aby zmienić czcionkę (nie rozmiar czcionki) na wykresie utworzonym za pomocą matplotlib w Pythonie.

Znalazłem kilka samouczków, aby zmienić domyślną czcionkę matplotlib, modyfikując niektóre pliki w folderach, w których matplotlib przechowuje domyślną czcionkę - zobacz ten post na blogu - ale szukam mniej radykalnego rozwiązania, ponieważ chciałbym użyć więcej niż jednego czcionka na moim wykresie (tekst, etykieta, etykieta osi itp.).

SirC
źródło
Cieszę się, że pomogło :) Czy możesz opublikować kod, który powoduje ten błąd? Sam nie widziałem tego błędu, ale oto kilka linków, które mogą ci pomóc. matplotlib.1069221.n5.nabble.com/… matplotlib.1069221.n5.nabble.com/Fonts-not-found-td12936.html
aidnani8
Kod, który generuje problem, to: hfont = {'fontname':'Helvetica'} plt.annotate('Country ', (0.17,0.95), xytext=None, xycoords='figure fraction',size=28, color='red', horizontalalignment = 'left', **hfont)a /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]))zamiast tego błąd występuje, jeśli użyję nazwy czcionki Comic Sans MS, jak w twoim przykładzie, kod działa.
SirC

Odpowiedzi:

103

Powiedzmy, że w tytule chcesz otrzymać Comic Sans, a dla wytwórni x Helvetica.

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

plt.title('title',**csfont)
plt.xlabel('xlabel', **hfont)
plt.show()
aidnani8
źródło
1
Próbowałem i działa! To jest dokładnie to, czego szukałem. Jednak dla niektórych czcionek mam następujący komunikat o błędzie (nie dla wszystkich) /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])). Jak mogę zainstalować Helvetica w zestawie czcionek znanych z matplotlib?
SirC
4
znajdź plik fontList.cache, możesz użyć tylko tych wymienionych tam. Alternatywnie zajrzyj tutaj stackoverflow.com/questions/20206906/…
B.Kocis
3
w związku z powyższym komentarzem. Aby znaleźć plik fontList.cache, użyj funkcji matplotlib.get_cachedir ()
CS,
51

Możesz także użyć rcParamsdo globalnej zmiany rodziny czcionek.

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

Lista argumentów rodziny czcionek matplotlib znajduje się tutaj .

więcej pingwinów
źródło
23

Wolę zatrudniać:

from matplotlib import rc
#rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})
rc('font',**{'family':'serif','serif':['Times']})
rc('text', usetex=True)
guhur
źródło
Świetny sposób na globalną zmianę czcionki, szukałem tego. Ostatnia linijka nie jest konieczna, nie jestem pewien, co ma z tym wspólnego Tex. Jeśli pojawi się błąd, ponieważ Matplotlib nie znalazł żądanej
smcs
7
import pylab as plb
plb.rcParams['font.size'] = 12

lub

import matplotlib.pyplot as mpl
mpl.rcParams['font.size'] = 12
nagordon
źródło
9
niewiarygodnie, że jest to dokładnie polecenie, którego szukałem. zdecydowanie nie to, o co prosił OP
niebieski
2

Czcionka Helvetica nie jest dostarczana z systemem Windows, więc aby z niej skorzystać, należy ją pobrać jako plik .ttf. Następnie możesz skierować do niego matplotlib w ten sposób (zastąp „crm10.ttf” swoim plikiem):

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) pokaże ci, gdzie powinieneś umieścić plik .ttf.

Możesz zobaczyć dane wyjściowe tutaj: https://matplotlib.org/gallery/api/font_file.html

bPiMin
źródło
Czy istnieje jakiś sposób, aby ustawić fontpropertiesglobalnie, dzięki czemu nie trzeba określać go z każdym wywołaniu np set_title(), set_xlabel()itp?
Kyle Mills
1
^ Aby odpowiedzieć na moje własne pytanie: stackoverflow.com/questions/35668219
Kyle Mills