def y_ticks(y, pos):
decades = [1e9, 1e6, 1e3, 1e0 ]
suffix = ['B', 'M', 'K', '']
if y == 0:
return str(0)
for i, d in enumerate(decades):
if np.abs(y) >=d:
val = y/float(d)
signf = len(str(val).split('.')[1])
if signf == 0:
return '{val:d} {suffix}'.format(val=int(val), suffix=suffix[i])
else:
if signf == 1:
if str(val).split('.')[1] == '0':
return '{val:d} {suffix}'.format(val=int(round(val)), suffix=suffix[i])
tx = '{'+'val:.{signf}f'.format(signf = signf) +'} {suffix}'
return tx.format(val=val, suffix=suffix[i])
return y
我想用简单的方式编写此功能,使其变得复杂起来。我是python的新手,有人可以帮我写这个吗?这样做的目的是动态更改y滴答声
例如:1000000-> 1M,1000000000-> 1B
答案 0 :(得分:0)
这就是我简化功能的方式:
def y_ticks_(y, pos):
# map to choose suffix
value_to_suffix = {1e3: ' K', 1e6: ' M', 1e9: ' B'}
# initialize value and suffix
value = y
suffix = ''
# choose appropriate suffix
for val in sorted(value_to_suffix):
# "> 1 - 10 ** -10" is used instead of ">= 1" because of how floats are represented in Python - precision is limited by 15 digits.
if abs(y / val) > 1 - 10 ** -10:
value = y / val
suffix = value_to_suffix[val]
else:
break
# create string from value and suffix
y_new = '{:.3f}'.format(value).strip('0').strip('.') + suffix
return y_new
原始版本与修改版本之间的比较:
print('{:>15}|{:>15}|{:>15}|'.format('value', 'original', 'new'))
print('-' * 48)
for val in [10, -5, 102, -200, 1001, -1234, 15200, -22000, 99001,
1e5, 1e6, 1e7, 1999999, 1999999.99, 1e9]:
print(
'{:>15}|{:>15}|{:>15}|'
.format(val, y_ticks(val, list()), y_ticks_(val, list())))
比较结果:
value| original| new|
------------------------------------------------
10| 10 | 10|
-5| -5 | -5|
102| 102 | 102|
-200| -200 | -200|
1001| 1.001 K| 1.001 K|
-1234| -1.234 K| -1.234 K|
15200| 15.2 K| 15.2 K|
-22000| -22 K| -22 K|
99001| 99.001 K| 99.001 K|
100000.0| 100 K| 100 K|
1000000.0| 1 M| 1 M|
10000000.0| 10 M| 10 M|
1999999| 1.999999 M| 2 M|
1999999.99| 1.99999999 M| 2 M|
1000000000.0| 1 B| 1 B|
编辑。关于Python中的浮点数。
在这种代码中使用>= 1
几乎在任何情况下都不是问题。但请考虑示例:
a = 0
a += 1.01 / 2.03
a -= 1 / 2.03
a -= .01 / 2.03
在所有这些操作之后, a
应该为零,但在我的机器上a
等于-6.938893903907228e-18
,因为精度受到限制。要检查浮点数之间的相等性时,必须考虑到这一事实。