Вопрос-Ответ

Prevent scientific notation

Предотвращение научной нотации

У меня есть следующий код:

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()

который выдает следующий график:

график

Как мне предотвратить научную нотацию здесь? Нарушен ли ticklabel_format? не решает проблему фактического удаления смещения.

plt.plot(np.arange(1e6, 3 * 1e7, 1e6))
plt.ticklabel_format(useOffset=False)

введите описание изображения здесь

Переведено автоматически
Ответ 1

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

Однако, 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 будет иметь смещение (обратите внимание на знак +), а ось y будет использовать научную нотацию (в качестве множителя - без знака плюс).

введите описание изображения здесь

Мы можем отключить любой из них по отдельности. Наиболее удобным способом является 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')

введите описание изображения здесь

Ответ 2

Другой способ предотвратить научную нотацию - это "расширить" интервал, в котором научная нотация не используется, используя параметр scilimits=.

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

результат1

Здесь научная нотация используется для оси, если ограничение оси меньше 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-limit (999999) меньше, чем 10 ^ 6, ограничение по умолчанию.

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

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

результат 2

Ответ 3

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

    # Disable scientific notation on axes
# by setting the threshold exponent very high
matplotlib.rcParams["axes.formatter.limits"] = (-99, 99)
python matplotlib plot