如何在matplotlib中设置轴倍增器的值?

时间:2015-03-06 17:35:08

标签: python matplotlib plot

我必须在(0, 32000)范围内绘制值。当我这样做时,我得到以下刻度标签:

0, 5000, 10000, 15000, 20000, 25000, 30000, 35000

但我希望有以下内容:

0, 5, 10, 15, 20, 25, 30, 35

使用轴倍增器(在刻度标签下面的那个小数字)x 10^3。我真的需要x 10^3

我知道如何强制matplotlib使用轴倍增器。当我使用以下内容时:

fmt = ScalarFormatter()
fmt.set_powerlimits((-3, 3))
ax.xaxis.set_major_formatter(fmt)

或者这个:

pylab.ticklabel_format(axis='x', style='sci', scilimits=(-3, 3),
                       useOffset=False)

matplotlib总是以轴乘​​数x 10^4返回,所以我得到了这些丑陋的刻度标签:

0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5

您同意乘数x 10^3会产生更好的刻度标签。如何设置10^3而不是10^4

This question类似,但不涉及为轴倍增器设置具体值。

2 个答案:

答案 0 :(得分:1)

available tickers中,有两个选项:

  1. EngFormatter()
  2. FuncFormatter()

例如,使用EngFormatter可获得SI prefixes,还可以通过传递unit='Hz'获得一个单位。

通常,您可以定义自己的格式化程序

scale_factor = 10**3
fmt = mpl.ticker.FuncFormatter(lambda x, pos: '{0:g}'.format(x/scale_factor))

编辑: 您还可以将ScalarFormatter子类化,并覆盖幅度确定的顺序,如:

class MagnitudeFormatter(matplotlib.ticker.ScalarFormatter):
    def __init__(self, exponent=None):
        super().__init__()
        self._fixed_exponent = exponent

    def _set_order_of_magnitude(self):
        if self._fixed_exponent:
            self.orderOfMagnitude = self._fixed_exponent
        else:
            super()._set_order_of_magnitude()

然后使用MagnitudeFormatter(3)作为格式化程序。这样做的好处是保留了“ 1e3”轴装饰。

答案 1 :(得分:0)

这可能不是您要查找的答案,但是您可以指定轴刻度标题的列表。例如,与其绘制从1到10的每个刻度线,不如绘制['1', '', '3', '', '5', '', '7', '', '9']这样的列表,它只会在其他每个刻度线上显示一个刻度线标签。这意味着只要您要绘制的域不变,您就可以指定要显示的确切字符串。如果您希望我可以在执行此操作的地方张贴一些代码。