Matplotlib:刻度标签与字体设置不一致(LaTeX文本示例)

时间:2017-04-06 07:21:42

标签: python matplotlib tex

我有以下简单的python代码:

import numpy as np
import matplotlib.pyplot as plt 

plt.rc( 'font', size=20, family="Times" )   # use a font with serifs

# the following line triggers the problem
plt.rc( 'text', usetex=True )               # activate LaTeX text rendering

fig = plt.figure( figsize=(8,6) )           # (width,height) in inches
ax1 = fig.add_subplot( 1, 1, 1 )            # rows cols plotnumber

ax1.plot( np.linspace(1,10,10), np.linspace(1,10,10)**2 )

ax1.set_xlabel( r'\textit{x} in a.u.' )
ax1.set_ylabel( r'\textit{y} in a.u.' )

plt.show()

这导致下图: Font thickness in tick-labels wrong

正如您所看到的,与轴标签(或轴标签太厚)相比,刻度标签的字体太细。我发现这是由于激活了LaTeX文本渲染(请参阅代码中的注释),但我不知道如何更改它,因为我不想关闭LaTeX文本渲染。

任何想法为什么字体厚度(厚度的复数是多少?)是不一致的以及如何改变它?

更新1 :根据llap42的建议,黑客将会做

plt.xticks([2, 4, 6, 8, 10], ['2', '4', '8', '10' ])

但这只是一个黑客,必须有一个更好的解决方案。

2 个答案:

答案 0 :(得分:2)

如评论中所述,这与使用乳胶时不符合字体设置的ticklabels相关。

这个问题似乎只发生在使用ScalarFormatter(这是轴的默认格式化程序)时。我在GitHub上发布了an issue

解决方法可能是使用不同的Formatter。例如StrMethodFormatter

import matplotlib.pyplot as plt 
import matplotlib.ticker

plt.rc( 'text', usetex=True ) 
plt.rc('font',family = 'sans-serif',  size=20)

fig , ax = plt.subplots(figsize=(5,3))

ax.set_xlabel( r'\textit{x} in a.u.' )
ax.set_ylabel( r'\textit{y} in a.u.' )

fmt = matplotlib.ticker.StrMethodFormatter("{x}")
ax.xaxis.set_major_formatter(fmt)
ax.yaxis.set_major_formatter(fmt)

plt.tight_layout()
plt.show()

enter image description here

答案 1 :(得分:0)

另一种解决方案是将乳胶使用的字体设置为sans-serif字体。如何实现这一点已在tex.stackexchange上进行了解释。

一种解决方案是使用sfmath乳胶包装。要将其添加到序言中,请使用

    plt.rc('text.latex', preamble=r'\usepackage[cm]{sfmath}')

这也适用于对数刻度,其中other proposed solution失败。