我真的希望在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中,什么是一种可移植且可靠的方法来实现相同的结果呢?
1条答案
按热度按时间rseugnpd1#
感谢您分享您以前的解决方案。它似乎仍然是硬编码到创建文本的函数中,到目前为止只能通过从
ScalarFormatter
继承来解决。这是我使用版本3.8.1的猴子补丁。字符串