¿Cómo cargar el archivo .ttf en matplotlib usando mpl.rcParams?

Tengo un script de matplotlib que comienza …

import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.font_manager as fm mpl.rcParams['xtick.labelsize']=16 ... 

He usado el comando

 fm.findSystemFonts() 

para obtener una lista de las fonts en mi sistema. Descubrí la ruta completa a un archivo .ttf que me gustaría usar,

 '/usr/share/fonts/truetype/anonymous-pro/Anonymous Pro BI.ttf' 

He intentado usar esta fuente sin éxito usando los siguientes comandos

 mpl.rcParams['font.family'] = 'anonymous-pro' 

y

 mpl.rcParams['font.family'] = 'Anonymous Pro BI' 

que ambos devuelven algo como

 /usr/lib/pymodules/python2.7/matplotlib/font_manager.py:1218: UserWarning: findfont: Font family ['anonymous-pro'] not found. Falling back to Bitstream Vera Sans 

¿Puedo usar el diccionario mpl.rcParams para establecer esta fuente en mis gráficos?

EDITAR

Después de leer un poco más, parece que este es un problema general de determinar el nombre de la familia de fonts a partir de un archivo .ttf. ¿Es esto fácil de hacer en linux o python?

Además, he intentado añadir

 mpl.use['agg'] mpl.rcParams['text.usetex'] = False 

sin ningún éxito

Especificando una familia de fonts:

Si todo lo que sabe es la ruta al ttf, puede descubrir el nombre de la familia de fonts utilizando el método get_name :

 import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.font_manager as font_manager path = '/usr/share/fonts/truetype/msttcorefonts/Comic_Sans_MS.ttf' prop = font_manager.FontProperties(fname=path) mpl.rcParams['font.family'] = prop.get_name() fig, ax = plt.subplots() ax.set_title('Text in a cool font', size=40) plt.show() 

Especificando una fuente por ruta:

 import matplotlib.pyplot as plt import matplotlib.font_manager as font_manager path = '/usr/share/fonts/truetype/msttcorefonts/Comic_Sans_MS.ttf' prop = font_manager.FontProperties(fname=path) fig, ax = plt.subplots() ax.set_title('Text in a cool font', fontproperties=prop, size=40) plt.show() 

Puede usar el comando fc-query myfile.ttf para verificar la información de metadatos de una fuente de acuerdo con el sistema de fonts de Linux (fontconfig). Debe imprimir sus nombres que matplotlib aceptará. Sin embargo, la integración de matplotlib fontconfig es bastante parcial en este momento, así que me temo que es muy probable que encuentre errores y limitaciones que no existen para las mismas fonts en otras aplicaciones de Linux.

(este triste estado está oculto por todos los nombres de fuente codificados en la configuración predeterminada de matplotlib, tan pronto como empiezas a intentar cambiarlos, estás en tierra peligrosa)

Aunque lo hice en menos de 100 líneas, @nim esto también explica con más detalle lo peligroso que es, algunas modificaciones cambian completamente el comportamiento de la propiedad y el tamaño de la fuente.

requisitos previos: Matplotlib y una carpeta de fonts en el mismo nivel de la secuencia de comandos que contiene el archivo de fonts ttf calibri.ttf

Pero esto es lo que tengo para ti como un huevo de pascua:

 import os import matplotlib import matplotlib.pyplot as plt import matplotlib.font_manager as fm from matplotlib import ft2font from matplotlib.font_manager import ttfFontProperty __font_dir__ = os.path.join(os.path.dirname(__file__),"font") fpath = os.path.join(__font_dir__,'calibri.ttf') font = ft2font.FT2Font(fpath) fprop = fm.FontProperties(fname=fpath) ttfFontProp = ttfFontProperty(font) fontsize=18 fontprop = fm.FontProperties(family='sans-serif', #name=ap.fontprop.name, fname=ttfFontProp.fname, size=fontsize, stretch=ttfFontProp.stretch, style=ttfFontProp.style, variant=ttfFontProp.variant, weight=ttfFontProp.weight) matplotlib.rcParams.update({'font.size': fontsize, 'font.family': 'sans-serif'}) fig, axis = plt.subplots() axis.set_title('Text in a cool font',fontsize=fontsize,fontproperties=fontprop) ax_right = axis.twinx() axis.set_xlabel("some Unit",fontsize=fontsize,fontproperties=fontprop) leftAxesName,rightAxesName = "left Unit", "right Unit" axis.set_ylabel(leftAxesName,fontsize=fontsize,fontproperties=fontprop) if rightAxesName: ax_right.set_ylabel(rightAxesName,fontsize=fontsize,fontproperties=fontprop) for xLabel in axis.get_xticklabels(): xLabel.set_fontproperties(fontprop) xLabel.set_fontsize(fontsize) for yLabel in axis.get_yticklabels(): yLabel.set_fontproperties(fontprop) yLabel.set_fontsize(fontsize) yTickLabelLeft = ax_right.get_yticklabels() for yLabel in yTickLabelLeft: yLabel.set_fontproperties(fontprop) yLabel.set_fontsize(fontsize) axis.plot([0,1],[0,1],label="test") nrow,ncol=1,1 handels,labels= axis.get_legend_handles_labels() propsLeft=axis.properties() propsRight=ax_right.properties() print(propsLeft['title'],propsLeft['xlabel'],propsLeft['ylabel']) print(propsRight['ylabel']) fig.set_tight_layout({'rect': [0, 0, 1, 0.95], 'pad': 0.05, 'h_pad': 1.5}) fig.tight_layout() fig.set_alpha(True) leg_fig = plt.figure() leg = leg_fig.legend(handels, labels, #labels = tuple(bar_names) ncol=ncol, mode=None, borderaxespad=0., loc='center', # the location of the legend handles handleheight=None, # the height of the legend handles #fontsize=9, # prop beats fontsize markerscale=None, frameon=False, prop=fontprop) plt.show()