Matplotlib, 使用latex保持字体一致性

77

我的问题是我想在某些图形中使用Latex标题,在其他图形中不使用Latex。目前,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()

我所说的不一致在这里。轴刻度标签看起来比标题要薄。


我相信这个答案会对你有所帮助。 - grg rsr
2个回答

82

为了使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}$')

如果您想让普通文本看起来像数学公式文本,可以将所有内容都更改为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为你渲染一切并使用一个字体,但这样做会很慢,而且不完全必要。


15
做得好!使用“stix”选项,程序运行良好;然而,通过将matplotlib.rcParams['mathtext.fontset'] = 'stix'更改为matplotlib.rcParams['mathtext.fontset'] = 'cm'可以获得最好的LaTeX结果。这是LaTeX的字体“computer modern” 。最终将字体系列更改为matplotlib.rcParams['font.family'] = 'cmu serif'可能也有效,但在我的情况下,我遇到了减号的问题,因此我将“'stix'”更改为“'cm'”,但我保留了“'STIXGeneral'”,结果看起来不错 ;) - loved.by.Jesus
1
@loved.by.Jesus:默认情况下是否可以使用 cm 作为 x 轴刻度和 y 轴刻度? - s.ouchene

19

编辑

如果你想在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)

1
我认为我应该澄清我的问题。目前,我认为Latex字体比较丑陋,我想让它与非Latex字体保持一致。我希望有更粗的字体,这样如果图表被缩小并放在论文/出版物中,我的绘图文本仍然可读。 - ncRubert
另外澄清一下,我想要加粗坐标轴标签。它们是图表中最难以阅读的部分。我已经更新了问题以反映这一点。 - ncRubert
@ncRubert rc设置是全局的,它会影响图中所有字体。 - nye17
4
是否有一种自动的方法将坐标轴刻度标签默认设置为粗体?我想让标签更高,更宽,并使每个字符更加粗细。 - ncRubert
如果图表缩小后与文本一致,您应该增加字体大小。不可否认,matplotlib 可能会使此过程繁琐。 - M. Toya
我得到了RuntimeError: LaTeX was not able to process the following string: 'lp'。我需要在我的机器上(OSX)先安装LaTeX吗? - n1000

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