gpt4 book ai didi

python - matplotlib中以空格作为千​​位分隔符的科学刻度数

转载 作者:行者123 更新时间:2023-12-04 04:00:15 24 4
gpt4 key购买 nike

我想在 y 轴上按以下方式格式化刻度:

  • 数字 < 1M 应该写出来,用空格作为千​​位分隔符(例如 20 000 )
  • 数字 > 1M 应该采用科学记数法,就像标量格式化程序一样(2.0 与轴上方的 x10^6)。

  • 现在,我可以分别实现这两个功能。
    matplotlib.ticker.FuncFormatter(lambda x, p: format(x, ',').replace(',', ' '))
    用空格替换千位分隔符。
    formatter = matplotlib.ticker.ScalarFormatter()
    formatter.set_powerlimits((-4, 6))
    给出 1M+ 的科学记数法。

    我想我必须设置一个 ScalarFormatter 并稍微改变它的一个功能,或者我必须用 FuncFormatter 写在 y 轴上方。但是,我找不到如何做到这一点。
    编辑
    我稍微接近了我的目标。通过使用 format(x, ',.6g').replace(',', ' ') 我至少有所需的数字格式。
    尽管如此,我更喜欢在轴上方使用指数符号,并且对于我所有的刻度,如果最大的变得太大......

    最佳答案

    原则上,您可以为标量格式化程序使用 set_useLocale(True) 并使用修改后的语言环境。然而,ScalarFormatter 不使用分组(参见 source ),因此我们必须派生我们自己的 ScalarFormatter 并设置 grouping=True )。

    import matplotlib.pyplot as plt
    from matplotlib.ticker import ScalarFormatter
    import locale

    fig, (ax1, ax2) = plt.subplots(ncols=2)

    ax1.set_ylim(1, 10_000)
    ax2.set_ylim(1, 10_000_000)


    class MyScalarFormatter(ScalarFormatter):
    def __call__(self, x, pos=None):
    if len(self.locs) == 0:
    return ''
    else:
    xp = (x - self.offset) / (10. ** self.orderOfMagnitude)
    if abs(xp) < 1e-8:
    xp = 0
    if self._useLocale:
    s = locale.format_string(self.format, (xp,), grouping=True)
    else:
    s = self.format % xp
    return self.fix_minus(s)

    sf = MyScalarFormatter(useLocale=True)
    locale._override_localeconv = {'thousands_sep': ' ', 'grouping': [3,0]}

    ax1.yaxis.set_major_formatter(sf)
    ax2.yaxis.set_major_formatter(sf)

    plt.show()
    enter image description here

    关于python - matplotlib中以空格作为千​​位分隔符的科学刻度数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63135303/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com