gpt4 book ai didi

python - 自定义 matplotlib 偏移中的偏移

转载 作者:行者123 更新时间:2023-12-01 08:35:04 25 4
gpt4 key购买 nike

This question解决了我目前面临的问题。我有一些数据,例如 [12.301, 12.318, 12.302],在绘制时,会导致偏移量显示为 +1.23e1

我不介意偏移量本身,但是用指数形式而不是只写 12.3 不太好。我可以以某种方式强制指数仅出现在十的三次幂的倍数中吗? 1e3 代替 1000 有意义,1e1 代替 10 完全没有意义。

我找到了this other question有点相关,但这与只有整数形式更相关,而我不介意小数。

最佳答案

在网络上进行一些搜索并调整找到的答案 here , here ,和 here加上 print(dir(ScalarFormatter)),我能够调整第一个链接的帖子:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter, FormatStrFormatter

#from https://stackoverflow.com/a/45332730/2454357
def fexp(f):
return int(np.floor(np.log10(abs(f)))) if f != 0 else 0

#from https://stackoverflow.com/a/45332730/2454357
def fman(f):
return f/10**fexp(f)

#adapted from https://stackoverflow.com/a/3679918/2454357
class PowerMultipleOfThreeFormatter(ScalarFormatter):
"""Formats axis ticks using scientific notation with a constant order of
magnitude"""
def __init__(self, useOffset=True, useMathText=False):
ScalarFormatter.__init__(self, useOffset=useOffset,
useMathText=useMathText)

def _set_orderOfMagnitude(self, range):
"""Over-riding this to avoid having orderOfMagnitude reset elsewhere"""
exponent = fexp(range)
if -3 < exponent < 3:
self.orderOfMagnitude = 0
else:
new_exp = (exponent//3)*3
self.orderOfMagnitude = new_exp


def format_data(self, *args, **kwargs):

##make sure that format_data does everyting it shoud:
super(PowerMultipleOfThreeFormatter, self).format_data(
*args, **kwargs
)

##compute the offset in the right format
exponent = fexp(self.offset)
mantissa = fman(self.offset)
if -3 < exponent < 3:
return '{:g}'.format(self.offset)

new_exp = (exponent//3)*3
factor = 10**new_exp

##from https://stackoverflow.com/a/2440786/2454357
man_string = '{}'.format(self.offset/factor).rstrip('0').rstrip('.')
return man_string+'e{}'.format(new_exp)

# Generate some random data...
x = np.linspace(55478, 55486, 100)
y = np.random.random(100) - 0.5
y = np.cumsum(y)
y *= 1e-8

# Plot the data...
fig,axes = plt.subplots(nrows=2, ncols=2)
for ax, y0 in zip(axes.ravel(), [-1e4, 1.15e-4, 12, -0.1]):
ax.plot(x, y+y0, 'b-')
ax.yaxis.set_major_formatter(PowerMultipleOfThreeFormatter())

fig.tight_layout()
plt.show()

一般来说,这个想法是计算一个数字的指数和尾数,并对两者进行操作,使得指数是 3 的倍数(使用 (exponent//3)*3指数%3)。对于乘法器,已经演示过 here ,应在何处以及如何添加这些计算(即在 _set_orderOfMagnitude 中)。偏移值存储在 ScalarFormatter.offset 中,字符串表示形式在函数 format_data() 中计算。通过重载该函数,我们可以更改偏移量的显示方式。该代码还包含一个如何使用新格式化程序的示例(如何生成数据的方式再次无耻地从 here 复制)。代码的结果如下所示:

result of above code

关于python - 自定义 matplotlib 偏移中的偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53766893/

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