如何获取Matplotlib当前可用的所有字体列表?

59

比如说当我想要设置字体时,可以使用font标签。

matplotlib.rc('font', **font)

显然,这些选项都不能列出mpl-data目录中可用的字体,该目录位于~/anaconda/lib/pythonX.X/site-packages/matplotlib/mpl-data/fonts/ttf(尝试import matplotlib; matplotlib.matplotlib_fname()以获取确切位置)。尽管在此位置使用fname=<font>加载字体成功。有没有人能给出一个能够做到这一点的答案? - Luke Davis
5个回答

77
import matplotlib.font_manager
matplotlib.font_manager.findSystemFonts(fontpaths=None, fontext='ttf')

查看这里获取其他选项。


很酷,谢谢!顺便说一句:显然你需要 import matplotlib.font_manager 才能让事情发生;-) - nye17
2
此外,指定的参数是默认值,因此 matplotlib.font_manager.findSystemFonts() 返回相同的结果。 - Joe Kington
16
如何获取已安装的字体族名称而非单个文件名? - pwuertz

33

要获取matplotlib可用字体的(可读)列表:

import matplotlib.font_manager
flist = matplotlib.font_manager.get_fontconfig_fonts()
names = [matplotlib.font_manager.FontProperties(fname=fname).get_name() for fname in flist]
print names

文档建议使用get_fontconfig_fonts():

这是一种简单的方法,可以获取用户想要在应用程序中使用的所有字体,而不需要知道它们全部在哪里。

请注意,您可以通过使用FontProperties类轻松地获取(反向)名称到字体查找:

font = matplotlib.font_manager.FontProperties(family='TeX Gyre Heros')
file = matplotlib.font_manager.findfont(font)

findfont 如果找不到匹配的字体属性,它会返回一个默认字体,因此具有鲁棒性。


1
好的,谢谢。看起来这个给出了实际的可调用名称,而被接受的答案则显示了实际的.ttf文件。不幸的是,由于某种原因,在我的Macbook(MacOS Sierra)上失败了,但在我使用的一些远程Linux服务器上可以工作。被接受的答案在任何地方都有效。 - Luke Davis
1
出现错误:“RuntimeError:在FT2Font中:无法加载字体。未知文件格式。” - Asier R.
4
返回空列表 Python 3.8.3 + matploblib 3.3.2。 - YTZ
matplotlib.font_manager.get_fontconfig_fonts() C:\QGB\Anaconda3\Scripts\ipython:1: MatplotlibDeprecationWarning: get_fontconfig_fonts函数在Matplotlib 3.5中已被弃用,并将在两个次要版本后被删除。 Out[178]: [] - CS QGB
如果你只是用 findSystemFonts() 替换 get_fontconfig_fonts(),那么这个程序就能正常工作。 - Brandon Kuczenski

28

根据这篇博客文章,以下代码可以让你获取可用的字体以及样例:

import matplotlib.font_manager
from IPython.core.display import HTML

def make_html(fontname):
    return "<p>{font}: <span style='font-family:{font}; font-size: 24px;'>{font}</p>".format(font=fontname)

code = "\n".join([make_html(font) for font in sorted(set([f.name for f in matplotlib.font_manager.fontManager.ttflist]))])

HTML("<div style='column-count: 2;'>{}</div>".format(code))
例如:

输入图像描述


这在我使用Google Colab时没有起作用。似乎Matplotlib字体可能不会在Matplotlib之外的地方可用? - getup8

18

被接受的答案仅提供计算机上字体文件的路径列表,而没有字体名称,您可以将其传递给 rcParams 。 @Alodi的回答解决了这个问题,但已经过时。

在Python 3.8.8和Matplotlib 3.3.4中,您可以使用以下内容:

import matplotlib.font_manager
fpaths = matplotlib.font_manager.findSystemFonts()

for i in fpaths:
    f = matplotlib.font_manager.get_font(i)
    print(f.family_name)

它打印字体名称的列表:

Padauk Book
Laksaman
Waree
Umpush
Latin Modern Roman Demi
Tlwg Mono
Gubbi
...

截至2022年,这应该是被接受的答案。顺便说一句,天啊,我有很多字体... - Michael Currie
1
当我运行这个程序时,我得到了很多重复的内容。通过将字体添加到一个集合中,然后在循环之后打印该集合,我得到了一个更有用的列表。这样做的额外好处是可以对列表进行排序。 - craigim

10

matplotlib 3.6.0 新特性

现在,有一个帮助方法get_font_names()用于列出所有可用的字体:

from matplotlib import font_manager
font_manager.get_font_names()

请注意,生成的列表不会按字母顺序排序。如果你只是在程序中进行检查,那么这是可以接受的,但是如果你需要目视检查,请按字母顺序排序以方便浏览。
sorted(font_manager.get_font_names())

# ['Advent Pro',
#  'Anonymous Pro',
#  ...
#  'DejaVu Sans',
#  'DejaVu Sans Mono',
#  'DejaVu Serif',
#  ...
#  'Noto Mono',
#  'Noto Sans',
#  'Noto Serif',
#  ...
#  'Roboto',
#  'Roboto Flex',
#  'Roboto Mono',
#  'Roboto Serif',
#  ...
#  'TeX Gyre Adventor',
#  'TeX Gyre Bonum',
#  'TeX Gyre Chorus',
#  'TeX Gyre Cursor',
#  'TeX Gyre Heros',
#  'TeX Gyre Pagella',
#  'TeX Gyre Schola',
#  'TeX Gyre Termes',
#  ...
#  'Ubuntu',
#  'Ubuntu Mono']

1
谢谢,这是唯一一个完美适合我的答案。 - Willy Lutz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接