x.x格式科学样式y-ticks matplotlib

时间:2019-03-27 10:14:36

标签: python matplotlib

我正在使用matplotlib创建一些图。

对于情节,我将style='sci'scilimits=(0,0)一起使用

代码如下:

for key in urbs_values.keys():
    # y-Axis (values)
    u[key] = np.array(urbs_values[key])
    o[key] = np.array(oemof_values[key])

    # draw plots
    plt.plot(i, u[key], label='urbs_'+str(key), linestyle='None', marker='x')
    plt.ticklabel_format(axis='y', style='sci', scilimits=(0, 0))
    plt.plot(i, o[key], label='oemof_'+str(key), linestyle='None', marker='.')
    plt.ticklabel_format(axis='y', style='sci', scilimits=(0, 0))

这通常是一致的,但是有时我会以x.x的格式在y轴上获取值,有时会得到x.xx的y轴,但我并不觉得它很优雅。

是否有一种方法可以通过动态缩放科学符号来强制matplotlib以x.x之类的格式始终为我提供y值?

这是我不喜欢的示例情节:

hamburg

1 个答案:

答案 0 :(得分:0)

您可以根据数据中的最大值动态设置限制:

def grabMaxExponent(values, precision=1):
    """Given a list of numericals, returns the exponent of the max
    value in scientific notation, adjusted to have no sig figs in
    decimal places.

    e.g. 190 > 1.9E+02 > 19E+01
    returns exponent (1)"""

    # Grab max value and convert to scientific notation
    value = format(max(values), f"5.{precision}E")

    # Pull exponent
    a,m = value.split('E+')
    a,b = a.split('.')
    a,b,m = map(int, (a,b,m))

    # If significant figures non-zero, increase exponent to bring them before decimal point
    if b > 0:
        m-=precision

    return m

m = grabMaxExponent(y)

# Set scilimits to m
plt.ticklabel_format(axis='y', style='sci', scilimits=(m,m))

https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.ticklabel_format.html