Змінити шкалу осей x у matplotlib


93

Я створив цей сюжет за допомогою Matlab

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

Використовуючи matplotlib, x-axies малює великі числа, такі як 100000, 200000, 300000. Я хотів би мати щось на зразок 1, 2, 3 і 10 ^ 5, щоб вказати, що насправді це 100000, 200000, 300000.

Чи є простий спосіб створити такий масштаб у matplotlib?

Відповіді:


145

Спробуйте використати matplotlib.pyplot.ticklabel_format:

import matplotlib.pyplot as plt
...
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))

Це стосується наукових позначень (тобто a x 10^b) до ваших позначок на осі х


9
чи можна додати зсув? (наприклад, замість 0,0, 0,5, 1,0, 1,5, ... та x 10 ^ b це буде 0, 5, 10, 15, ... та x 10 ^ {b-1})
Eagle

24
ticklabel_formatтакож є методом для об'єктів осей, ви можете спробувати щось на зразокax.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
Covich

Як це може працювати, якщо у вас є підзаголовки, скажімо, 2 сюжетів?
FaCoffee

2
@Eagle вибачте, я мав на увазі ваше подальше запитання щодо додавання компенсації. моя вісь х є, [0.1, 0.2, ...]і я б віддав перевагу [1, 2, ...]скоригованому показнику. Ви змогли знайти рішення для цього?
trianta2

@Eagle Мене також цікавить згадане питання trianta2
Бен Усман

15

Це не стільки відповідь на ваше початкове запитання, скільки на один із запитів, які ви мали в тілі свого запитання.

Трохи преамбули, щоб моє називання не здавалося дивним:

import matplotlib
from matplotlib import rc
from matplotlib.figure import Figure
ax = self.figure.add_subplot( 111 )

Як уже зазначалося, ви можете використовувати ticklabel_format, щоб вказати, що matplotlib повинен використовувати наукові позначення для великих або малих значень:

ax.ticklabel_format(style='sci',scilimits=(-3,4),axis='both')

Ви можете вплинути на спосіб відображення цього, використовуючи прапори в rcParams (з імпорту matplotlib rcParams) або встановлюючи їх безпосередньо. Я не знайшов більш елегантного способу переходу між науковими позначеннями '1e' та 'x10 ^', ніж:

ax.xaxis.major.formatter._useMathText = True

Це має надати вам більше Matlab-esc, і справді, можливо кращий зовнішній вигляд. Я думаю, що наступне повинно зробити те саме:

rc('text', usetex=True)

11

У скалярних Formatter підтримують збір експонента. Документи такі:

клас matplotlib.ticker.ScalarFormatter (useOffset = True, useMathText = False, useLocale = None) Основи: matplotlib.ticker.Formatter

Місце галочки - це звичайний старий номер. Якщо useOffset == True і діапазон даних набагато менший, ніж середнє значення даних, тоді буде визначено зсув таким чином, щоб мітки галочки були значущими. Наукові позначення використовуються для даних <10 ^ -n або даних> = 10 ^ m, де n і m - межі потужності, встановлені за допомогою set_powerlimits ((n, m)). За замовчуванням вони контролюються параметром rx axes.formatter.limits.

Ваша техніка буде такою:

from matplotlib.ticker import ScalarFormatter
xfmt = ScalarFormatter()
xfmt.set_powerlimits((-3,3))  # Or whatever your limits are . . .
{{ Make your plot }}
gca().xaxis.set_major_formatter(xfmt)

Щоб експонент відображався у форматі x10^5, створіть інстанцію ScalarFormatter за допомогою useMathText=True.

Після зображення

Ви також можете використовувати:

xfmt.set_useOffset(10000)

Щоб отримати такий результат:

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


3
Оберіть ScalarFormatter, useMathText=Trueщоб отримати x10^4.
Тілл Хоффманн

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.