формат xx научный стиль y-ticks matplotlib - PullRequest
2 голосов
/ 27 марта 2019

Я создаю несколько сюжетов, используя 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))

Обычно это согласуется, но иногда я получаю значения по оси Y в формате x.x, а иногда я получаю x.xx, и я на самом деле не нахожу это элегантным.

Есть ли способ заставить matplotlib всегда давать мне значения y в формате, подобном x.x, посредством динамического масштабирования научной нотации?

Вот пример графика, который мне не нравится:

hamburg

1 Ответ

0 голосов
/ 27 марта 2019

Вы можете установить свои лимиты динамически в зависимости от максимального значения в ваших данных:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...