Изменить масштаб осей x в matplotlib

95

Я создал этот сюжет с помощью Matlab

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

Используя matplotlib, оси x рисуют большие числа, такие как 100000, 200000, 300000. Я хотел бы иметь что-то вроде 1, 2, 3 и 10 ^ 5, чтобы указать, что на самом деле это 100000, 200000, 300000.

Есть ли простой способ создать такой масштаб в matplotlib?

Орел
источник

Ответы:

147

Попробуйте использовать matplotlib.pyplot.ticklabel_format:

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

Это применяет научную нотацию (т.е. a x 10^b) к вашим отметкам оси X

Крис
источник
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
Как это может работать, если у вас есть подзаговор, скажем, из двух участков?
FaCoffee
2
@Eagle, извините, я имел в виду ваш следующий вопрос о добавлении смещения. моя ось x есть, [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 import rcParams) или задав их напрямую. Я не нашел более элегантного способа переключения между научными обозначениями '1e' и 'x10 ^', чем:

ax.xaxis.major.formatter._useMathText = True

Это должно дать вам больше Matlab-esc и, возможно, лучший внешний вид. Я думаю, что следующее должно делать то же самое:

rc('text', usetex=True)
Weir_Doe
источник
11

В скалярных Formatter поддерживают сбор экспонента. Документы следующие:

class matplotlib.ticker.ScalarFormatter (useOffset = True, useMathText = False, useLocale = None) Базы: matplotlib.ticker.Formatter

Расположение отметки - обычное старое число. Если useOffset == True и диапазон данных намного меньше, чем среднее значение данных, то смещение будет определено таким образом, чтобы метки галочки были значимыми. Научное представление используется для данных <10 ^ -n или data> = 10 ^ m, где n и m - пределы мощности, установленные с помощью set_powerlimits ((n, m)). Значения по умолчанию для них контролируются параметром axes.formatter.limits rc.

ваша техника будет:

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=Trueget x10^4.
Тилль Хоффманн,
9

Я нахожу простое решение

pylab.ticklabel_format(axis='y',style='sci',scilimits=(1,4))
Cunzhang
источник