【问题标题】:How to align tick labels when numbers have superscript in it in maptlotlib?当matplotlib中的数字有上标时如何对齐刻度标签?
【发布时间】:2019-06-20 15:45:50
【问题描述】:

我正在生成一个图形,其中 x 轴设置为以 10 为底的对数刻度,并且我希望标签是短数字的普通数字(1、10、100),并且在太长时用上标缩写( $10^{3}$, $10^{4}$)。

问题是纯文本和带有上标的数学文本的边界框不同。具体来说,文本底部和上标符号边界框的底部边缘之间有额外的空白。

因此,当我尝试将标签(文本 + bbox)与 set_ha('bottom') 对齐时,bbox 已正确对齐,但文本不是因为数学文本标签中的额外空白。

这个问题似乎与here 有点相关,只是在我的情况下,我正在处理表现不同的数学和非数学符号。

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

def setup(ax):
    """Only show bottom axis"""
    ax.spines['top'].set_visible(False)
    ax.spines['left'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.yaxis.set_major_locator(ticker.NullLocator())

fig = plt.figure(figsize=(8, 1))
ax = fig.add_subplot(1, 1, 1)

setup(ax)

ticklabels = [r'0', r'10', r'$100$', r'$10^3$', r'$10^4$', r'$10^5$']
ax.set_xticklabels(ticklabels, fontdict=dict(fontsize=11))

# align and move labels
for label in ax.xaxis.get_majorticklabels():
    # uncomment to see the extra white space
    # below labels with superscript notation
    # label.set_bbox(dict(edgecolor='red', facecolor='none', pad=0))
    label.set_va('bottom')
    label.set_y(-.14)

Here 是一个显示我希望我的标签如何对齐的图。

有没有办法设置bbox,使两个符号之间标签下方的空间相同?

【问题讨论】:

  • 请解释您期望的行为?红色框可以在框的顶部边缘对齐,也可以在底部对齐。您的代码将它们对齐在底部边缘,如果您不使用 for 循环,它们将在顶部边缘对齐。您期望什么第三种行为。请附上一些手绘图来解释问题
  • 感谢您回答@Sheldore,我相应地编辑了我的帖子。我认为问题不在于对齐方式,而是我的 bbox 是不同的,无论我使用的是纯文本还是带有上标的数学文本。因此,对齐看起来很奇怪,因为文本没有对齐。也许有一种方法可以对齐 bbox 底部的文本标签?

标签: python matplotlib


【解决方案1】:

一种解决方案是在脚本顶部添加以下代码,以使用乳胶渲染所有文本以具有一致的边界框:

from matplotlib import rc
rc('text', usetex=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    相关资源
    最近更新 更多