¿Cómo cambiar las fuentes en matplotlib (python)?


84

Suena como un problema fácil, pero no encuentro ninguna solución efectiva para cambiar la fuente (no el tamaño de la fuente) en un diagrama realizado con matplotlib en python.

Encontré un par de tutoriales para cambiar la fuente predeterminada de matplotlib modificando algunos archivos en las carpetas donde matplotlib almacena su fuente predeterminada - vea esta publicación de blog - pero estoy buscando una solución menos radical ya que me gustaría usar más de una fuente en mi gráfico (texto, etiqueta, etiqueta del eje, etc.).


Me alegro de que haya ayudado :) ¿Puedes publicar el código que causa este error? Yo mismo no he visto este error, pero aquí hay algunos enlaces que pueden ayudarlo. matplotlib.1069221.n5.nabble.com/… matplotlib.1069221.n5.nabble.com/Fonts-not-found-td12936.html
aidnani8

El código que genera el problema es: hfont = {'fontname':'Helvetica'} plt.annotate('Country ', (0.17,0.95), xytext=None, xycoords='figure fraction',size=28, color='red', horizontalalignment = 'left', **hfont)y el error es, en /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]))cambio, si utilizo como nombre de fuente Comic Sans MS como en su ejemplo, el código funciona.
SirC

Respuestas:


98

Digamos que quiere Comic Sans para el título y Helvetica para la etiqueta x.

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

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

1
¡Lo intenté y funciona! Es exactamente lo que estaba buscando. Sin embargo, para algunos tipos de letra que tengo el mensaje de error siguiente (no para todos): /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])). ¿Cómo puedo instalar Helvetica en el conjunto de fuentes conocidas por matplotlib?
SirC

4
busque el archivo fontList.cache, puede usar solo los que se enumeran allí. Alternativamente, eche un vistazo aquí stackoverflow.com/questions/20206906/…
B.Kocis

3
siguiendo el comentario anterior. Para encontrar su archivo fontList.cache, use matplotlib.get_cachedir ()
CS

48

También puede utilizar rcParamspara cambiar la familia de fuentes de forma global.

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

La lista de argumentos de la familia de fuentes de matplotlib está aquí .


19

Prefiero emplear:

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

o

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

9
increíblemente, este es exactamente el comando que estaba buscando. Sin embargo
azul

2

La fuente Helvetica no viene incluida con Windows, por lo que para usarla debe descargarla como un archivo .ttf. Luego puede referirlo a matplotlib de esta manera (reemplace "crm10.ttf" con su archivo):

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) le mostrará dónde debe colocar el .ttf.

Puede ver el resultado aquí: https://matplotlib.org/gallery/api/font_file.html


¿Hay alguna forma de configurarlo fontpropertiesglobalmente para que no tenga que especificarlo con cada llamada a set_title(), por ejemplo,, set_xlabel()etc.?
Kyle Mills

1
^ Para responder a mi propia pregunta: stackoverflow.com/questions/35668219
Kyle Mills
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.