在Mac OS X 10.6上,无法在Python的Matplotlib中将字体更改为Helvetica

2024-04-23 09:14:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将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

显然它找不到海尔维蒂卡。我不知道为什么。我在mpl数据的afm目录中有Helvetica,当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和许多其他程序中看到它。

我正在使用热情的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'

你知道怎么解决吗?

谢谢。


Tags: importdatamatplotliblibpackageslibrarysiteframework
3条回答

我在安装Helvetica时仍然遇到问题。我在.dfont文件中使用了fondu,现在在mpl-data/fonts/ttf目录中有Helvetica.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就会显示得很好。

有什么建议吗?

解决方案是使用fondu将.dfont Helvetica字体从Mac OS X转换为.ttf,然后将其放在Matplotlib查找的mpl data/fonts目录中。这解决了问题。

OSX10.11ElCapitan和Python3的分步解决方案(基于this post)。

  1. 安装fondu: 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')

相关问题 更多 >