如何配置matplotlib以便能够从本地路径读取字体?

问题描述 投票:1回答:2

我希望能够将.ttf文件放在本地文件夹中,并将Matplotlib配置为在该文件夹中查找字体,如果它无法在正常的系统文件夹中找到它们。 This previous answer展示了如何指向任何目录中的特定字体。这是答案中的代码:

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()

这个问题是每次我想要Helvetica(或者在这种情况下是Comic Sans)时我都必须这样做。我相信另一个解决方案是将ttf文件复制到像~/anaconda/lib/python2.7/site-packages/matplotlib/mpl-data/fonts/ttf这样的东西,但我不想触摸那些东西并在本地放置文件,这样当我更新matplotlib时它们不会消失,因此更容易将我的配置同步到不同的机器。我觉得应该有一些方法在我的~/.matplotlib/matplotlibrc文件中配置matplotlib,这样如果我使用Helvetica,我不必每次都提供路径。如何将.ttf文件放在自定义目录中(或者至少一个对python或matplotlib更新安全的文件)并且每次绘制时都不必重新键入文件路径?

奖励积分如果解决方案允许我使用相对于import matplotlib; matplotlib.get_configdir()返回的目录的路径,因为对于我的一些机器是~/.config/matplotlib而某些机器是~/.matplotlib

python matplotlib fonts
2个回答
2
投票

如果有人关心,我决定将我的.ttf文件复制到看起来像~/anaconda/lib/python2.7/site-packages/matplotlib/mpl-data/fonts/ttf的目录是最方便的。在我更新了matplotlib之后文件仍然存在,所以至少它可能需要一段时间才能重复这个过程,这样我就不需要指向一个目录或者每次绘制时调用一个脚本。如果你这样做和/或更改你的matplotlibrc文件中的默认字体列表(我都这样做了),你可能不得不删除位于~/.matplotlib/fontList.cache或〜/ .cache / matplotlib / fontList.cache`之类的缓存文件。 Matplotlib将在下次绘制内容时重新生成。


1
投票

为了添加@ Ben的答案,我编写了一个脚本,可以自动为任何python发行版执行此操作。将.ttf文件放在某个文件夹中,然后运行此脚本将它们移动到matplotlib字体文件夹中。

#!/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}.')
© www.soinside.com 2019 - 2024. All rights reserved.