Предотвратить научную запись в matplotlib.pyplot

Я пытался подавить научную запись в pyplot уже несколько часов. После попытки нескольких решений безуспешно, я хотел бы помочь.

plt.plot(range(2003,2012,1),range(200300,201200,100))
# several solutions from other questions have not worked, including
# plt.ticklabel_format(style='sci', axis='x', scilimits=(-1000000,1000000))
# ax.get_xaxis().get_major_formatter().set_useOffset(False)
plt.show()

plot

Заранее спасибо.

3 ответа

Решение

В вашем случае вы действительно хотите отключить смещение. Использование научной нотации - это отдельная настройка от показа вещей в терминах значения смещения.

Тем не мение, ax.ticklabel_format(useOffset=False) должен был работать (хотя вы перечислили это как одну из вещей, которые не сделали).

Например:

fig, ax = plt.subplots()
ax.plot(range(2003,2012,1),range(200300,201200,100))
ax.ticklabel_format(useOffset=False)
plt.show()

Если вы хотите отключить смещение и научную нотацию, вы должны использовать ax.ticklabel_format(useOffset=False, style='plain'),


Разница между "смещением" и "научным обозначением"

В форматировании оси matplotlib "научное обозначение" относится к множителю для чисел, а "смещение" - это отдельный термин, который добавляется.

Рассмотрим этот пример:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(1000, 1001, 100)
y = np.linspace(1e-9, 1e9, 100)

fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()

Ось X будет иметь смещение (обратите внимание на + знак), а ось у будет использовать научную запись (в качестве множителя - без знака плюс).

Мы можем отключить любой из них по отдельности. Наиболее удобный способ ax.ticklabel_format метод (или plt.ticklabel_format).

Например, если мы позвоним:

ax.ticklabel_format(style='plain')

Мы отключим научную запись на оси Y:

И если мы позвоним

ax.ticklabel_format(useOffset=False)

Мы отключим смещение по оси X, но оставим научную запись по оси Y без изменений:

Наконец, мы можем отключить оба:

ax.ticklabel_format(useOffset=False, style='plain')

Другой способ предотвратить научную запись — «расширить» интервал, в котором научная запись не используется, с помощью параметра.

      plt.plot(np.arange(1e6, 3 * 1e7, 1e6))
plt.ticklabel_format(scilimits=(-5, 8))

Здесь экспоненциальное обозначение используется для оси, если предел оси меньше 10^-5 или больше 10^8.

По умолчанию экспоненциальное представление используется для чисел меньше 10^-5 или больше 10^6, поэтому, если наибольшее значение тиков находится в этом интервале, экспоненциальное представление не используется.

Итак, сюжет, созданный

      plt.plot(np.arange(50), np.logspace(0, 6));
plt.ylim((0, 1000000))

имеет научную запись, потому что 1000000=10^6, но сюжет создан

      plt.plot(np.arange(50), np.logspace(0, 6));
plt.ylim((0, 999999));

нет, потому что предел y (999999) меньше 10^6, предела по умолчанию.

Этот лимит по умолчанию можно изменить с помощьюscilimits=параметрticklabel_format(); просто передайте кортеж формата:(low, high)где верхняя граница тиков должна находиться в интервале(10^low, 10^high). Например, в следующем коде (немного крайний пример) тики отображаются как полные числа, потому чтоnp.logspace(0,100)[-1] < 10**101правда.

      plt.plot(np.logspace(0, 8), np.logspace(0, 100));
plt.ticklabel_format(scilimits=(0, 101))

Вы можете отключить это глобально для всех диаграмм, выполнив

          # Disable scientific notation on axes
    # by setting the threshold exponent very high
    matplotlib.rcParams["axes.formatter.limits"] = (-99, 99)
Другие вопросы по тегам