no se puede cambiar la fuente a Helvetica en Matplotlib en Python en Mac OS X 10.6

Estoy tratando de cambiar la fuente matplotlib a helvetica, que me gustaría usar en un gráfico PDF. Intento lo siguiente:

import matplotlib matplotlib.use('PDF') import matplotlib.pylab as plt from matplotlib import rc plt.rcParams['ps.useafm'] = True rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']}) plt.rcParams['pdf.fonttype'] = 42 

Esto no funciona; cuando ejecuto mi código con –verbose-debug, aparece el error:

 backend WXAgg version 2.8.10.1 /Library/Frameworks/Python.framework/Versions/6.2/lib/python2.6/site-packages/matplotlib/__init__.py:833: UserWarning: This call to matplotlib.use() has no effect because the the backend has already been chosen; matplotlib.use() must be called *before* pylab, matplotlib.pyplot, or matplotlib.backends is imported for the first time. findfont: Could not match :family=sans-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=medium. Returning /Library/Frameworks/Python.framework/Versions/6.2/lib/python2.6/site-packages/matplotlib/mpl-data/fonts/ttf/Vera.ttf Assigning font /F1 = /Library/Frameworks/Python.framework/Versions/6.2/lib/python2.6/site-packages/matplotlib/mpl-data/fonts/ttf/Vera.ttf Embedding font /Library/Frameworks/Python.framework/Versions/6.2/lib/python2.6/site-packages/matplotlib/mpl-data/fonts/ttf/Vera.ttf Writing TrueType font 

Así que aparentemente no puede encontrar a Helvetica. No estoy seguro por qué. Tengo Helvetica en el directorio afm de mpl-data, y cuando matplotlib lo inicia, lo lee y saca:

 createFontDict: /Library/Frameworks/Python.framework/Versions/6.2/lib/python2.6/site-packages/matplotlib/mpl-data/fonts/afm/Helvetica.afm 

¿Necesito además una fuente .ttf Helvetica especial? Si es así, ¿cómo puedo conseguirlo? Sé que tengo Helvetica en mi sistema ya que lo veo en Illustrator y muchos otros progtwigs.

Estoy usando la distribución Python de Enthought de la siguiente manera:

 $ python Enthought Python Distribution -- http://www.enthought.com Version: 6.2-2 (32-bit) Python 2.6.5 |EPD 6.2-2 (32-bit)| (r265:79063, May 28 2010, 15:13:03) [GCC 4.0.1 (Apple Inc. build 5488)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import matplotlib >>> matplotlib.__version__ '0.99.3' 

¿Alguna idea de cómo se puede arreglar esto?

Gracias.

La solución es usar fondu para convertir la fuente Helvetica de .dfont de Mac OS X a .ttf, y luego colocarla en el directorio mpl-data / fonts en el que se ve Matplotlib. Eso solucionó el problema.

Solución paso a paso para OS X 10.11 El Capitan y Python 3 (basado en este post ).

  1. Instalar fondu: brew install fondu
  2. Averigüe la ubicación matplotlib:

     python3 -c "import matplotlib ; print(matplotlib.matplotlib_fname())" 

    Para mí es /usr/local/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc

  3. Haz una copia de Helvetica:

     mkdir ~/Desktop/font_copies cp /System/Library/Fonts/Helvetica.dfont ~/Desktop/font_copies 
  4. Convierta la copia Helvetica que hemos hecho de dfont a ttf :

     cd /usr/local/lib/python3.5/site-packages/matplotlib/mpl-data/fonts/ttf/ fondu -show ~/Desktop/font_copies/Helvetica.dfont 
  5. Eliminar el caché de fonts: rm ~/.matplotlib/fontList.py3k.cache

¡Hecho! Ahora puedes usar Helvetica:

 import matplotlib.pyplot as plt plt.rc('font', family='Helvetica') 

Todavía estoy teniendo problemas para instalar Helvetica. Usé fondu en el archivo .dfont y ahora tengo Helvetica.ttf en el directorio mpl-data/fonts/ttf :

 $ pwd /Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/mpl-data/fonts/ttf $ ls COPYRIGHT.TXT RELEASENOTES.TXT STIXSizFiveSymReg.ttf Vera.ttf VeraSeBd.ttf Helvetica.ttf STIXGeneral.ttf STIXSizFourSymBol.ttf VeraBI.ttf cmb10.ttf HelveticaBold.ttf STIXGeneralBol.ttf STIXSizFourSymReg.ttf VeraBd.ttf cmex10.ttf HelveticaBoldOblique.ttf STIXGeneralBolIta.ttf STIXSizOneSymBol.ttf VeraIt.ttf cmmi10.ttf HelveticaLight.ttf STIXGeneralItalic.ttf STIXSizOneSymReg.ttf VeraMoBI.ttf cmr10.ttf HelveticaLightOblique.ttf STIXNonUni.ttf STIXSizThreeSymBol.ttf VeraMoBd.ttf cmss10.ttf HelveticaOblique.ttf STIXNonUniBol.ttf STIXSizThreeSymReg.ttf VeraMoIt.ttf cmsy10.ttf LICENSE_STIX STIXNonUniBolIta.ttf STIXSizTwoSymBol.ttf VeraMono.ttf cmtt10.ttf README.TXT STIXNonUniIta.ttf STIXSizTwoSymReg.ttf VeraSe.ttf 

Y he editado mi archivo ~/.matplotlib/matplotlibrc (que es el que se carga de acuerdo con --verbose-debug ):

 font.serif : Palatino, Bitstream Vera Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif font.sans-serif : Helvetica #, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Avant Garde, sans-serif 

Pero me sale este error al trazar:

 /Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/font_manager.py:1216: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to Bitstream Vera Sans (prop.get_family(), self.defaultFamily[fontext])) 

Si configuro la fuente predeterminada como serif , Palatino se muestra bien.

¿Algun consejo?

En caso de que ayude a alguien, escribí un script que agrega automáticamente fonts .ttf desde una carpeta personalizada a mpl-data . Coloque sus archivos .ttf en alguna carpeta y ejecute este script para moverlos.

 #!/usr/bin/env python3 # Imports import os import re import shutil from glob import glob from matplotlib import matplotlib_fname from matplotlib import get_cachedir # Copy files over _dir_data = re.sub('/matplotlibrc$', '', matplotlib_fname()) dir_source = '' dir_dest = f'{_dir_data}/fonts/ttf' # print(f'Transfering .ttf and .otf files from {dir_source} to {dir_dest}.') for file in glob(f'{dir_source}/*.[ot]tf'): if not os.path.exists(f'{dir_dest}/{os.path.basename(file)}'): print(f'Adding font "{os.path.basename(file)}".') shutil.copy(file, dir_dest) # Delete cache dir_cache = get_cachedir() for file in glob(f'{dir_cache}/*.cache') + glob(f'{dir_cache}/font*'): if not os.path.isdir(file): # don't dump the tex.cache folder... because dunno why os.remove(file) print(f'Deleted font cache {file}.') 

Esto apareció originalmente en esta publicación de stackoverflow .