当使用super和下标时,Matplotlib 2.0下标在基线之外

时间:2017-01-24 19:19:30

标签: python matplotlib subscript

使用matplotlib 2.0时,当我在同一个字符上同时使用下标和上标时,我一直有奇怪的行为。当它们组合时,下标完全低于基线。 MPL 1.5没有发生这种情况。这是一个完整的例子:

import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rc("font", family="Times New Roman",weight='normal')
plt.rcParams.update({'mathtext.default':  'regular' })
plt.plot(1,1, label='$A_x^{b}$')
plt.plot(2,2,label='$A_x$')
plt.plot(3,3,label='$A^b$')
plt.plot(4,4,label='$A_x^{*}$')
plt.plot(5,5,label='$A^*$')
plt.legend(fontsize='xx-large')
plt.show()

我拍摄了这个情节并放大了图例并绘制了一些水平线来显示相对的超级和下标位置。

enter image description here

我在mathtext.py文件中找到了FontConstantBase类下的这些参数:

# Percentage of x-height of additional horiz. space after sub/superscripts
script_space = 0.05

# Percentage of x-height that sub/superscripts drop below the baseline
subdrop = 0.4

# Percentage of x-height that superscripts are raised from the baseline
sup1 = 0.7

# Percentage of x-height that subscripts drop below the baseline
sub1 = 0.3

# Percentage of x-height that subscripts drop below the baseline when a
# superscript is present
sub2 = 0.5

# Percentage of x-height that sub/supercripts are offset relative to the
# nucleus edge for non-slanted nuclei
delta = 0.025

# Additional percentage of last character height above 2/3 of the
# x-height that supercripts are offset relative to the subscript
# for slanted nuclei
delta_slanted = 0.2

# Percentage of x-height that supercripts and subscripts are offset for
# integrals
delta_integral = 0.1

以前的版本中是否存在sub2?可以从0.3到0.5真的下降到完全低于基线,就像我看到的那样?我希望同时上标和下标完全不在基线之外,除了修改mathtext.py本身之外,我还没有看到任何其他方式。此外,似乎在上标中包含星号时,它也高于预期的mpl 2.0。有没有办法在不改变mathtext的情况下将其降低一点?谢谢。

1 个答案:

答案 0 :(得分:2)

似乎没有API可以更改此功能,但您可以修改apropiate类而不是编辑mathtext.py

使用默认的mathtext字体,如果有上标(不完全在基线下,但你可以看到效果),下标的位置会发生变化:

def test_plot():
    plt.figure()
    plt.plot(1,1, label='$A_x^b$')
    plt.plot(2,2,label='$A^b_x$')
    plt.plot(3,3,label='$A_x$')
    plt.plot(4,4,label='$A_x^*$')
    plt.plot(4,4,label='$A^*_x$')
    plt.plot(5,5,label='$A^*$')
    plt.legend(fontsize='xx-large')

# default mathtext font in matplotlib 2.0.0 is 'dejavusans'
# set explicitly for reproducibility
plt.rcParams['mathtext.fontset'] = 'dejavusans'
test_plot()

enter image description here

猴子修补mathtext.DejaVuSansFontConstants你可以让效果消失:

import matplotlib.mathtext as mathtext
mathtext.DejaVuSansFontConstants.sub2 = 0.3  # default 0.5
test_plot()

enter image description here

我无法看到星号的任何问题。

我没有安装Times New Roman,因此我无法测试您的确切用例,但可能需要修补FontConstantsBase而不是DejaVuSansFontConstants。它使用Liberation Serif为我工作。