【问题标题】:Python matplotlib: Change axis labels/legend from bold to regular weightPython matplotlib:将轴标签/图例从粗体更改为常规重量
【发布时间】:2013-04-23 16:00:05
【问题描述】:

我正在尝试制作一些具有出版质量的情节,但遇到了一个小问题。默认情况下,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,但如果不加载包 amsmath,Python 的解释器似乎无法识别这一点。我也试过:

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()

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

【问题讨论】:

    标签: python matplotlib latex


    【解决方案1】:

    另一个答案提供了一个解决问题的方法......但是,这个问题非常具体到 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

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

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

    这还有一个额外的好处,它适用于所有元素,甚至适用于标签和其他标题 - 没有使用数学模式的肮脏技巧:


    这是生成绘图的完整代码:

    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()
    

    【讨论】:

    • 你能发布你用于情节的代码吗?如果我理解正确,所有标签(轴和图​​例)的输入都类似于('label entry'),唯一的数学模式条目是 y-标签('$y-axis$')。如果是这样,那么这是一个很好的解决方案!
    • 该图完全是根据您的代码生成的,仅更改了突出显示的行!
    • 我在尝试在 matplotlib 中获取 LaTeX 字体时遇到了这个答案。事实证明,我不得不将'computer modern roman' 替换为'cmr10',这似乎产生了正确的效果。
    【解决方案2】:

    怎么样:

    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 上询问是否有更好的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 2015-06-28
      • 2021-03-19
      • 1970-01-01
      • 2020-12-11
      • 2020-03-29
      相关资源
      最近更新 更多