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

yeotifhr  于 2023-03-03  发布在  其他
关注(0)|答案(3)|浏览(262)

我希望能够将.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时都必须这样做我相信另一个解决方案是将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

fquxozlt

fquxozlt1#

如果有人关心的话,我决定把我的.ttf文件复制到类似~/anaconda/lib/python2.7/site-packages/matplotlib/mpl-data/fonts/ttf的目录下是最方便的。在我更新matplotlib之后,这些文件仍然在那里,所以至少在我不得不重复这个过程之前可能需要一段时间。这样我就不需要每次绘图时都指向目录或调用脚本。如果你这样做和/或更改matplotlibrc文件中的默认字体列表(我都做了)你可能需要删除缓存文件,比如~/.matplotlib/fontList.cache或~/.cache/matplotlib/fontList.cache '。下次你绘图的时候,Matplotlib会重新生成这个文件。

vulvrdjw

vulvrdjw2#

1.安装字体。在Windows中,右键单击并选择“安装”。在Linux中,将TTF文件放入~/.local/share/fonts/中并运行fc-cache。您可以检查它是否工作,并使用fc-list获得字体名称。
1.在您的虚拟环境中运行一次:matplotlib.font_manager._rebuild()
1.如果使用Jupyter,请重新启动内核。
1.将以下内容添加到代码中:

matplotlib.rcParams.update({
    'font.sans-serif': 'Graphik',
    'font.family': 'sans-serif',
})

1.对于某些字体,matplotlib没有得到正确的权重;您可能希望在rcParams中显式指定它们:

'font.weight': 'normal',
    'axes.labelweight': 'normal',
    'axes.titleweight': 'normal',
szqfcxe2

szqfcxe23#

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

#!/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_source = '<your-font-directory-here>'
dir_data = os.path.dirname(matplotlib_fname())
dir_dest = os.path.join(dir_data, 'fonts', 'ttf')
print(f'Transfering .ttf and .otf files from {dir_source} to {dir_dest}.')
for file in glob(os.path.join(dir_source, '*.[ot]tf')):
    if not os.path.exists(os.path.join(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(os.path.join(dir_cache, '*.cache')) + glob(os.path.join(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}.')

相关问题