matplotlib中的科学记数法cdot

bis0qfac  于 2023-11-22  发布在  其他
关注(0)|答案(1)|浏览(160)

我真的希望在matplotlib中使用$\cdot$而不是$\times$作为科学计数法。此外,我希望保留matplotlib.ticker.ScalarFormatter的所有默认设置,例如偏移量的计算。因此,我不能简单地使用FuncFormatter等创建一个新的格式化程序。
在matplotlib 3.3.1中,我通过继承ScalarFormatter解决了这个问题。

class MyScalarFormatter(ScalarFormatter):
    def _formatSciNotation(self, s):
        # transform 1e+004 into 1e4, for example
        if self._useLocale:
            decimal_point = locale.localeconv()['decimal_point']
            positive_sign = locale.localeconv()['positive_sign']
        else:
            decimal_point = '.'
            positive_sign = '+'
        tup = s.split('e')
        try:
            significand = tup[0].rstrip('0').rstrip(decimal_point)
            sign = tup[1][0].replace(positive_sign, '')
            exponent = tup[1][1:].lstrip('0')
            if self._useMathText or self._usetex:
                if significand == '1' and exponent != '':
                    # reformat 1x10^y as 10^y
                    significand = ''
                if exponent:
                    exponent = '10^{%s%s}' % (sign, exponent)
                if significand and exponent:
# Here is the only relevant change
                    return r'%s{\cdot}%s' % (significand, exponent)
                else:
                    return r'%s%s' % (significand, exponent)
            else:
                s = ('%se%s%s' % (significand, sign, exponent)).rstrip('e')
                return s
        except IndexError:
            return s

字符串
然后通过

ax.yaxis.set_major_formatter(MyScalarFormatter())


在matplotlib的新版本出现之前,这种方法一直都很可靠。当然,我可以再次使用monkey patch,但是在matplotlib>=3.5中,什么是一种可移植且可靠的方法来实现相同的结果呢?

rseugnpd

rseugnpd1#

感谢您分享您以前的解决方案。它似乎仍然是硬编码到创建文本的函数中,到目前为止只能通过从ScalarFormatter继承来解决。这是我使用版本3.8.1的猴子补丁。

class MyScalarFormatter(ScalarFormatter):
    def get_offset(self):
        if len(self.locs) == 0:
            return ''
        if self.orderOfMagnitude or self.offset:
            offsetStr = ''
            sciNotStr = ''
            if self.offset:
                offsetStr = self.format_data(self.offset)
                if self.offset > 0:
                    offsetStr = '+' + offsetStr
            if self.orderOfMagnitude:
                if self._usetex or self._useMathText:
                    sciNotStr = self.format_data(10 ** self.orderOfMagnitude)
                else:
                    sciNotStr = '1e%d' % self.orderOfMagnitude
            if self._useMathText or self._usetex:
                if sciNotStr != '':
                    # only relevant change
                    sciNotStr = r'\cdot\mathdefault{%s}' % sciNotStr
                s = fr'${sciNotStr}\mathdefault{{{offsetStr}}}$'
            else:
                s = ''.join((sciNotStr, offsetStr))
            return self.fix_minus(s)
        return ''

字符串

相关问题