не может изменить шрифт на Helvetica в Matplotlib в Python на Mac OS X 10.6 - PullRequest
16 голосов
/ 05 июля 2010

Я пытаюсь изменить шрифт matplotlib на helvetica, который я хотел бы использовать в графике PDF. Я пробую следующее:

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

Это не работает - когда я запускаю свой код с --verbose-debug, я получаю ошибку:

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

Так что, очевидно, он не может найти Гельветику. Я не уверен почему. У меня есть Helvetica в каталоге afm mpl-data, и когда matplotlib запускает его, он читает и выводит:

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

Нужен ли дополнительно специальный шрифт .ttf Helvetica? Если так, как я могу получить это? Я знаю, что у меня есть Helvetica в моей системе, так как я вижу это в Illustrator и многих других программах.

Я использую дистрибутив Enthought Python следующим образом:

$ 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'

Есть идеи, как это можно исправить?

спасибо.

Ответы [ 4 ]

17 голосов
/ 05 июля 2010

Решение состоит в том, чтобы использовать fondu для преобразования шрифта .dfont Helvetica из Mac OS X в .ttf, а затем поместите его в каталог mpl-data / fonts, в котором находится Matplotlib. Это решило проблему.

16 голосов
/ 28 февраля 2016

Пошаговое решение для OS X 10.11 El Capitan и Python 3 (на основе этой публикации ).

  1. Установка фондю: brew install fondu
  2. Узнайте местонахождение matplotlib:

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

    Для меня это /usr/local/lib/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc

  3. Сделайте копию Helvetica:

    mkdir ~/Desktop/font_copies
    cp /System/Library/Fonts/Helvetica.dfont ~/Desktop/font_copies
    
  4. Преобразовать сделанную нами копию Helvetica из dfont в ttf:

    cd /usr/local/lib/python3.5/site-packages/matplotlib/mpl-data/fonts/ttf/
    fondu -show ~/Desktop/font_copies/Helvetica.dfont
    
  5. Удалить кэш шрифтов: rm ~/.matplotlib/fontList.py3k.cache

Готово!Теперь вы можете использовать Helvetica:

import matplotlib.pyplot as plt
plt.rc('font', family='Helvetica')
5 голосов
/ 16 ноября 2012

У меня все еще проблемы с установкой Helvetica. Я использовал фондю для файла .dfont и теперь у меня есть Helvetica.ttf в каталоге 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

И я отредактировал мой ~/.matplotlib/matplotlibrc файл (который загружен в соответствии с --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

Но я получаю эту ошибку при печати:

/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]))

Если я установлю шрифт по умолчанию как serif, Palatino обнаружится просто отлично.

Какие-нибудь советы?

0 голосов
/ 11 декабря 2017

На случай, если это кому-нибудь поможет, я написал скрипт, который автоматически добавляет .ttf шрифты из пользовательской папки в mpl-data. Поместите ваши .ttf файлы в какую-то папку и запустите этот скрипт, чтобы переместить их.

#!/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 = '<your-font-directory-here>'
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}.')

Первоначально он появился в этом сообщении о стеке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...