Предотвратить научную запись в 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()
Заранее спасибо.
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)