Wie ändere ich Schriftarten in matplotlib (Python)?


84

Es klingt nach einem einfachen Problem, aber ich finde keine effektive Lösung, um die Schriftart (nicht die Schriftgröße) in einem mit matplotlib in Python erstellten Plot zu ändern.

Ich habe ein paar Tutorials gefunden, um die Standardschriftart von matplotlib zu ändern, indem ich einige Dateien in den Ordnern geändert habe, in denen matplotlib die Standardschriftart speichert - siehe diesen Blog-Beitrag -, aber ich suche nach einer weniger radikalen Lösung, da ich mehr als eine verwenden möchte Schriftart in meinem Plot (Text, Beschriftung, Achsenbeschriftung usw.).


Ich bin froh, dass es geholfen hat :) Kannst du den Code posten, der diesen Fehler verursacht? Ich habe diesen Fehler selbst nicht gesehen, aber hier sind einige Links, die Ihnen helfen können. matplotlib.1069221.n5.nabble.com/… matplotlib.1069221.n5.nabble.com/Fonts-not-found-td12936.html
aidnani8

Der Code, der das Problem generiert, ist: hfont = {'fontname':'Helvetica'} plt.annotate('Country ', (0.17,0.95), xytext=None, xycoords='figure fraction',size=28, color='red', horizontalalignment = 'left', **hfont)und der Fehler ist /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]))stattdessen, wenn ich wie in Ihrem Beispiel als Schriftart Comic Sans MS verwende, funktioniert der Code.
SirC

Antworten:


98

Angenommen, Sie möchten Comic Sans für den Titel und Helvetica für das x-Label.

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

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

1
Ich habe es versucht und es funktioniert! Es ist genau das, wonach ich gesucht habe. Bei einigen Schriftarten wird jedoch die folgende Fehlermeldung angezeigt (nicht für alle) : /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])). Wie kann ich Helvetica in den von matplotlib bekannten Schriftarten installieren?
SirC

4
Wenn Sie die Datei fontList.cache suchen, können Sie nur die dort aufgeführten verwenden. Alternativ können Sie hier einen Blick auf stackoverflow.com/questions/20206906/… werfen
B.Kocis

3
Weiterverfolgung des obigen Kommentars. Um Ihre fontList.cache-Datei zu finden, verwenden Sie matplotlib.get_cachedir ()
CS

48

Sie können rcParamsdie Schriftfamilie auch global ändern.

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

Die Liste der Argumente der Matplotlib-Schriftfamilie finden Sie hier .


19

Ich beschäftige lieber:

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

oder

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

9
Unglaublicherweise ist dies genau der Befehl, nach dem ich gesucht habe. definitiv nicht das, was OP gefragt hat
blau

2

Die Helvetica-Schriftart ist nicht in Windows enthalten. Um sie zu verwenden, müssen Sie sie als .ttf-Datei herunterladen. Dann können Sie matplotlib wie folgt darauf verweisen (ersetzen Sie "crm10.ttf" durch Ihre Datei):

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) zeigt Ihnen, wo Sie die .ttf platzieren sollten.

Sie können die Ausgabe hier sehen: https://matplotlib.org/gallery/api/font_file.html


Gibt es eine Möglichkeit setzen fontpropertiesglobal , so dass Sie es nicht angeben müssen , um mit jedem Aufruf zB set_title(), set_xlabel()usw.?
Kyle Mills

1
^ Um meine eigene Frage zu beantworten: stackoverflow.com/questions/35668219
Kyle Mills
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.