如何在matplotlib中自定义偏移量

时间:2015-06-12 19:06:53

标签: python-3.x matplotlib

我想在matplotlib中自定义偏移量使用。具体做法是:

  • 使用时设置限制(类似于科学计数法的功率限制)
  • 在两个轴刻度上自定义格式字符串。这样做 ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%.1f'))关闭科学记数法。

感谢您的回答,如果有人遇到同样的问题,这里是我用来解决它的代码:

import matplotlib.pyplot as plt
from matplotlib import ticker
import numpy as np

class ScalarFormatter(ticker.ScalarFormatter):
    def __init__(self, useOffset=None, useMathText=None, useLocale=None):
        ticker.ScalarFormatter.__init__(self, useOffset, useMathText, useLocale)
        self._powerlimits = (0, 0)


    def _set_offset(self, range):
        mean_locs = np.mean(self.locs)

        if range / 2 < np.absolute(mean_locs):
            ave_oom = np.floor(np.log10(mean_locs))
            p10 = 10 ** np.floor(np.log10(range))
            self.offset = (np.ceil(np.mean(self.locs) / p10) * p10)
        else:
            self.offset = 0


    def get_offset(self, txt=''):
        if self.orderOfMagnitude:
            txt += u'\u00D7' + '1e%d' % self.orderOfMagnitude + ' '

        if self.offset:
            if self.offset > 0:
                txt += '+'
            txt += self.format_data(self.offset)

        return self.fix_minus(txt)

2 个答案:

答案 0 :(得分:1)

事实上,正如安德烈斯正确回答的那样,%.1e会给你我所理解的作为轴上打印的刻度值的科学格式。但是,设置FormatStrFormatter会关闭默认格式化程序的所谓科学格式化功能,其中指数不是使用每个单独的刻度值格式化,而是作为所谓的偏移字符串的一部分。这是因为该功能仅适用于默认格式化程序类ticker.ScalarFormatter。据我所知,遗憾的是,它没有为它的格式字符串提供接口。然而,它将提供方法set_powerlimits。我说你最好的选择是继承ticker.ScalarFormatter并覆盖相应的方法。不要害怕,这不会太困难,只需查看matplotlib.ticker.ScalarFormatter的源代码并覆盖您需要的任何内容。我快速偷看了,这是我的想法:

  • tick格式字符串存储在属性.format中,该属性在方法def _set_format(self, vmin, vmax):中设置。您可以手动覆盖属性.format,但只要轴限制发生变化,就会重置该属性。为了更加健壮,您可以替换不执行任何操作的_set_format

  • 类似地,偏移值存储在属性.offset中,当offset为0时不显示。该属性由函数def _set_offset(self, range):设置。如果要在应用偏移时自定义限制,则除了复制该功能并调整限制值(可能取决于某些新的offsetLimit属性)之外别无选择。

答案 1 :(得分:0)

对于科学记数法,%e及其变体(python string formatting)。

要自定义限制,请检查axes.set_xlim()axes.set_ylim()