Python matplotlib:将轴标签/图例从粗体更改为常规重量

时间:2013-04-29 20:46:50

标签: python matplotlib latex

我正在尝试制作一些出版品质的图,但我遇到了一个小问题。默认情况下,matplotlib轴标签和图例条目的加权比轴刻度标记重。无论如何强制轴标签/图例条目与刻度线的重量相同吗?

import matplotlib.pyplot as plt
import numpy as np

plt.rc('text',usetex=True)
font = {'family':'serif','size':16}
plt.rc('font',**font)
plt.rc('legend',**{'fontsize':14})

x = np.linspace(0,2*np.pi,100)
y = np.sin(x)

fig = plt.figure(figsize=(5,5))
p1, = plt.plot(x,y)
p2, = plt.plot(x,x**2)
plt.xlabel('x-Axis')
plt.ylabel('y-Axis')
plt.legend([p1,p2],['Sin(x)','x$^2$'])
plt.gcf().subplots_adjust(left=0.2)
plt.gcf().subplots_adjust(bottom=0.15)
plt.savefig('Test.eps',bbox_inches='tight',format='eps')
plt.show()

我可以使用数学模式,但问题(烦恼)是我有一个标签的句子,即

plt.xlabel('$\mathrm{This is the x-axis}$') 
总而言之。我可以使用

来修复它
plt.xlabel('$\mathrm{This\: is\: the\: x-axis}$')

但这需要很多标点符号。我希望有一些我可以改变的东西可以让我绕过\mathrm{}格式,并使用标准的TeX格式。

我尝试的另一个选项是使用\text而不是\mathrm,但似乎Python的解释器在没有加载包amsmath的情况下无法识别。我也尝试过:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

plt.rc('text',usetex=True)
font = {'family':'serif','size':16}
plt.rc('font',**font)
plt.rc('legend',**{'fontsize':14})
matplotlib.rcParams['text.latex.preamble']=[r'\usepackage{amsmath}']

x = np.linspace(0,2*np.pi,100)
y = np.sin(x)

fig = plt.figure(figsize=(5,5))
p1, = plt.plot(x,y)
p2, = plt.plot(x,x**2)
plt.xlabel(r'$\text{this is the x-Axis}$')
plt.ylabel('$y-Axis$')
plt.legend([p1,p2],['Sin(x)','x$^2$'])
plt.gcf().subplots_adjust(left=0.2)
plt.gcf().subplots_adjust(bottom=0.15)
plt.savefig('Test.eps',bbox_inches='tight',format='eps')
plt.show()

这也不会返回所需的结果。

2 个答案:

答案 0 :(得分:5)

怎么样:

enter image description here

import matplotlib.pyplot as plt
import numpy as np

plt.rc('text',usetex=True)
font = {'family':'serif','size':16}
plt.rc('font',**font)
plt.rc('legend',**{'fontsize':14})

x = np.linspace(0,2*np.pi,100)
y = np.sin(x)

fig = plt.figure(figsize=(5,5))
p1, = plt.plot(x,y)
p2, = plt.plot(x,x**2)
plt.xlabel('$\mathrm{This is the }x\mathrm{-axis}$'.replace(' ','\: '))
plt.ylabel('$y\mathrm{-axis}$')
plt.legend([p1,p2],['$\sin(x)$','$x^2$'], loc='best')
fig.subplots_adjust(left=0.2, bottom=0.15)
plt.savefig('Test.eps',bbox_inches='tight',format='eps')
plt.show()

这使用

plt.xlabel('$\mathrm{This is the }x\mathrm{-axis}$'.replace(' ','\: '))

'\: '替换空格。然而,TeX专家可能会反对这一点。您可以在TeX stackexchange询问是否有更好的方式。

答案 1 :(得分:5)

另一个答案提供了解决问题的方法......但是,问题非常特定于matplotlib和LateX后端的实现。

首先,控制轴标签字体粗细的rc参数为'axes.labelweight',默认设置为u'normal'。这意味着标签应该已经正常重量。

可以在matplotlib/texmanager.py

中找到字体显示为粗体的原因
  1. 字体系列由'font.family'选择,如果是OP,则为serif

  2. 然后,计算数组'font.<font.family>'(此处为:font.serif),并将所有字体的声明添加到LateX前导码中。这些声明中有一行

    \renewcommand{\rmdefault}{pnc}
    

    将默认设置为New Century School Book which appears to be a bold version of Computer Modern Roman

  3. 总之,解决问题的最简单方法是将font.serif设置为仅包含Computer Modern Roman:

    font = {'family':'serif','size':16, 'serif': ['computer modern roman']}
    

    这有一个额外的好处,它适用于所有元素,即使对于标签和其他字幕 - 没有使用数学模式的脏技巧: enter image description here

    以下是生成图表的完整代码:

    import matplotlib
    import matplotlib.pyplot as plt
    import numpy as np
    
    plt.rc('text',usetex=True)
    #font = {'family':'serif','size':16}
    font = {'family':'serif','size':16, 'serif': ['computer modern roman']}
    plt.rc('font',**font)
    plt.rc('legend',**{'fontsize':14})
    matplotlib.rcParams['text.latex.preamble']=[r'\usepackage{amsmath}']
    
    x = np.linspace(0,2*np.pi,100)
    y = np.sin(x)
    
    fig = plt.figure(figsize=(5,5))
    p1, = plt.plot(x,y)
    p2, = plt.plot(x,x**2)
    plt.xlabel(r'$\text{this is the x-Axis}$')
    plt.ylabel('$y-Axis$')
    plt.legend([p1,p2],['Sin(x)','x$^2$'])
    plt.gcf().subplots_adjust(left=0.2)
    plt.gcf().subplots_adjust(bottom=0.15)
    plt.savefig('Test.eps',bbox_inches='tight',format='eps')
    plt.show()