69

我的问题是我想在某些情节中使用乳胶标题,而在其他情节中不使用乳胶。现在,matplotlib 为 Latex 标题和非 Latex 标题有两种不同的默认字体,我希望两者保持一致。是否有我必须更改的 RC 设置才能自动允许此设置?

我使用以下代码生成一个图:

import numpy as np
from matplotlib import pyplot as plt

tmpData = np.random.random( 300 )

##Create a plot with a tex title
ax = plt.subplot(211)
plt.plot(np.arange(300), tmpData)
plt.title(r'$W_y(\tau, j=3)$')
plt.setp(ax.get_xticklabels(), visible = False)

##Create another plot without a tex title
plt.subplot(212)
plt.plot(np.arange(300), tmpData )
plt.title(r'Some random numbers')
plt.show()

这就是我所说的不一致。相对于标题,轴刻度标签看起来很薄。:

4

2 回答 2

66

要使 tex-style/mathtext 文本看起来像常规文本,您需要将 mathtext 字体设置为 Bitstream Vera Sans,

import matplotlib
matplotlib.rcParams['mathtext.fontset'] = 'custom'
matplotlib.rcParams['mathtext.rm'] = 'Bitstream Vera Sans'
matplotlib.rcParams['mathtext.it'] = 'Bitstream Vera Sans:italic'
matplotlib.rcParams['mathtext.bf'] = 'Bitstream Vera Sans:bold'
matplotlib.pyplot.title(r'ABC123 vs $\mathrm{ABC123}^{123}$')

如果您希望常规文本看起来像 mathtext 文本,您可以将所有内容更改为 Stix。这将影响标签、标题、刻度等。

import matplotlib
matplotlib.rcParams['mathtext.fontset'] = 'stix'
matplotlib.rcParams['font.family'] = 'STIXGeneral'
matplotlib.pyplot.title(r'ABC123 vs $\mathrm{ABC123}^{123}$')

基本思想是您需要将常规字体和数学文本字体设置为相同,并且这样做的方法有点晦涩难懂。您可以看到自定义字体的列表,

sorted([f.name for f in matplotlib.font_manager.fontManager.ttflist])

正如其他人所提到的,您还可以通过在 rcParams 中设置 text.usetex 来让 Latex 使用一种字体为您呈现所有内容,但这很慢而且并非完全必要。

于 2014-12-29T23:12:48.177 回答
17

编辑

如果您想更改 matplotlib 中 LaTeX 使用的字体,请查看此页面

http://matplotlib.sourceforge.net/users/usetex.html

其中一个例子是

from matplotlib import rc
rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})
## for Palatino and other serif fonts use:
#rc('font',**{'family':'serif','serif':['Palatino']})
rc('text', usetex=True)

只选择你最喜欢的!

如果你想要粗体字体,你可以试试\mathbf

plt.title(r'$\mathbf{W_y(\tau, j=3)}$')

编辑 2

以下将为您设置粗体字体

font = {'family' : 'monospace',
        'weight' : 'bold',
        'size'   : 22}

rc('font', **font)
于 2012-07-06T18:36:30.857 回答