matplotlib:如何访问内部cm字体?

Hoj*_*Cho 3 python fonts matplotlib

我在 Windows 10 上使用 python2.7 和 Anaconda,并且在配置字体时遇到一些问题。

首先,我知道如果我安装所需的字体,这个问题很快就能解决。但我想知道是否可以在不安装任何新字体的情况下解决这个问题。

我有这个简单的绘图代码。

import matplotlib as mpl
mpl.rcParams['font.family']='serif'
mpl.rcParams['mathtext.fontset']='cm'
import matplotlib.pyplot as plt

plt.plot([1,2,3],[4,3,4])
plt.text(1.5,4,'Hello!')
plt.show()
Run Code Online (Sandbox Code Playgroud)

它工作完美。由于我的计算机上没有安装 Computer Modern 字体(考虑到我安装了 TeXLive,这很奇怪,但这无关紧要。),因此matplotlib必须在内部安装它。现在,我希望我的衬线字体也能成为计算机现代字体。我以为添加

mpl.rcParams['font.serif']=['cm']
Run Code Online (Sandbox Code Playgroud)

行与行之间mpl.rcParams[]会起作用。相反,它给出了这个警告

C:\ProgramData\Anaconda2\lib\site-packages\matplotlib\font_manager.py:1297: UserWarning: findfont: Font family [u'serif'] not found. Falling back to DejaVu Sans
(prop.get_family(), self.defaultFamily[fontext]))
Run Code Online (Sandbox Code Playgroud)

这很令人困惑。我的计算机上没有安装计算机现代字体,但由于设置mathtext.fontset工作cm正常,我认为应该有某种方法来为font.serif.

对此有什么解决方案吗?

que*_*ner 5

与 mpl 使用的内部 Computer Modern 字体相对应的正确 ttf 文件存储在数据路径中的某个位置。以下代码应该可以完成这项工作:

import matplotlib as mpl
import matplotlib.font_manager as font_manager

mpl.rcParams['font.family']='serif'
cmfont = font_manager.FontProperties(fname=mpl.get_data_path() + '/fonts/ttf/cmr10.ttf')
mpl.rcParams['font.serif']=cmfont.get_name()
mpl.rcParams['mathtext.fontset']='cm'
mpl.rcParams['axes.unicode_minus']=False
import matplotlib.pyplot as plt

plt.plot([-1,2,3],[4,3,4])
plt.text(1.5,4,'Hello!')
plt.show()
Run Code Online (Sandbox Code Playgroud)

线路

mpl.rcParams['axes.unicode_minus']=False
Run Code Online (Sandbox Code Playgroud)

需要解决一些与减号相关的问题。