问题概述

  • windows使用anaconda中的spyder,将ipython作为代码解释器
  • 使用matplotlib中的pylab绘图时,在%matplotlib inline模式下中文显示方框

问题分析:

  • 默认使用自带的字体,无法使用系统的其他字体,而自带字体库中缺省中文字体

解决方法:

  • 进入anaconda安装目录下的Lib\site-packages\matplotlib\mpl-data
  • 打开matplotlibrc文件,删除font.familyfont.sans-serif(axes.unicode_minus貌似不必要)前面的#
  • 上述文件中相应行修改后的结果如下所示,xx为中文字体名,其后的字体不修改。
    font.family         : sans-serif
    font.sans-serif     : xx, Bitstream Vera Sans, Lucida Grande...
    axes.unicode_minus  : False
  • 重启Spyder或者是重新启动console来使更改生效

xx字体名查找规则

  • C:\windows\fonts\下找到中文字体文件,文件属性中查看字体文件名,例如仿宋是simfang
  • 打开C:\Users\用户名\.matplotlib/fontList.cache字体索引文件(mac是home目录下),在文件中查找simfang,结果如下
    S'FangSong'
    p522
    sg15
    I400
    sg16
    g12
    sg17
    g12
    sg18
    VC:\u005cWindows\u005cFonts\u005csimfang.ttf
  • S'FangSong'中的FangSong即是字体文件对应的字体名,即要添加的xx。(mac下是类似VKaiti SC,其中Kaiti SC是相应的字体名)

字体名查找注意事项

  • 有些字体文件在C:\Users\用户名\.matplotlib/fontList.cache文件中查找不到相应字体名,但添加后在%matplotlib qt模式下显示正常,如Microsoft YaHei
  • 未查找到字体名的字体,可将其字体文件复制到anaconda安装目录\Lib\site-packages\matplotlib\mpl-data\fonts\ttf下,重启Spyder或者是重新启动console来更新fontList.cache
  • 若复制的字体文件是ttc文件则需在matplotlib安装目录下找到font_manager.py文件,在如下代码中添加ttc,删除font_manager.pyc文件,更新fontList.cache
    return {'ttf': ('ttf', 'ttc', 'otf'),
            'otf': ('ttf', 'otf'),
            'afm': ('afm',)}[fontext]
  • 执行以下语句也可重新创建字体索引列表
    >>> from matplotlib.font_manager import _rebuild
    >>>_rebuild()
最后由 oucb 编辑于2016年06月22日 14:29