动态变化的养生

时间:2018-11-07 06:03:38

标签: python python-3.x python-2.7 function matplotlib

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

1 个答案:

答案 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,因为精度受到限制。要检查浮点数之间的相等性时,必须考虑到这一事实。