在使用默认的mathtext而不是LaTeX数学渲染引擎时,在matplotlib 2.0.2中渲染数学时,我已经观察到错误。似乎某些字形(在我的情况下为负号和乘法符号)不能被mathtext识别。真正奇怪的是,仅当这些特定字形出现在刻度标签中时,才会发生错误。当我故意在其中输入一些数学表达式时图形标题,效果很好。
考虑下面的示例和生成的图像:
import matplotlib
import matplotlib.pyplot as plt
# Customize matplotlib
matplotlib.rcParams.update({# Use mathtext, not LaTeX
'text.usetex': False,
# Use the Computer modern font
'font.family': 'serif',
'font.serif': 'cmr10',
'mathtext.fontset': 'cm',
})
# Plot
plt.semilogy([-0.03, 0.05], [0.3, 0.05])
plt.title(r'$-6\times 10^{-2}$')
plt.savefig('test.png')
如图所示,刻度标签中的乘法和一些减号已被其他字符替换。如果我使用LaTeX(通过将
'text.usetex'
设置为True
),那么一切都会很好地呈现。为什么会发生这种情况,更重要的是,如何在不将数学文本更改为LaTeX的情况下进行修复?附加信息
这是在运行示例代码时显示的警告:
mathtext.py:866: MathTextWarning: Font 'default' does not have a glyph for '\times' [U+d7]
MathTextWarning)
mathtext.py:867: MathTextWarning: Substituting with a dummy symbol.
warn("Substituting with a dummy symbol.", MathTextWarning)
请注意,指数中出现的减号可以正确渲染。如果我忽略了'mathtext.fontset': 'cm'
,则会产生另一个类似的警告,这些也可能不会呈现:mathtext.py:866: MathTextWarning: Font 'default' does not have a glyph for '-' [U+2212]
MathTextWarning)
mathtext.py:867: MathTextWarning: Substituting with a dummy symbol.
warn("Substituting with a dummy symbol.", MathTextWarning)
另外,如果我在'axes.unicode_minus': False
中包含rcParams
(并保留'mathtext.fontset': 'cm'
),则所有减号都会正确渲染,尽管问题仍然存在于乘号上。在较旧版本的matplotlib上,乘法符号错误似乎不是问题(我已经测试了1.5.1、1.4.3和1.3.1)。但是,这些matplotib坚持只在10⁻²,10⁻¹,1、10、10²等处产生刻度线标签,因此根本不需要乘法符号。
错误报告
这已作为bug report提交给Matplotlib。
最佳答案
我发现STIX字体可以替代现代计算机。
import matplotlib
import matplotlib.pyplot as plt
# Customize matplotlib
matplotlib.rcParams.update(
{
'text.usetex': False,
'font.family': 'stixgeneral',
'mathtext.fontset': 'stix',
}
)
# Plot
plt.semilogy([-0.03, 0.05], [0.3, 0.05])
plt.title(r'$-6\times 10^{-2}$')
plt.savefig('test.png')
这将在我的笔记本电脑上产生以下输出: