Matplotlib: укажите формат поплавков для тиков

Я пытаюсь установить формат в два десятичных числа в среде subplot matplotlib. К сожалению, я не знаю, как решить эту задачу.

Чтобы предотвратить использование научной нотации по оси y, я использовал ScalarFormatter(useOffset=False), как вы можете видеть в моем фрагменте ниже. Я думаю, что моя задача должна быть решена путем передачи дополнительных параметров/аргументов используемому форматированию. Тем не менее, я не мог найти никакого намека на документацию matplotlib.

Как я могу установить две десятичные цифры или ни один (оба случая необходимы)? К сожалению, я не могу предоставить образцы данных.


- SNIPPET -

f, axarr = plt.subplots(3, sharex=True)

data = conv_air
x = range(0, len(data))

axarr[0].scatter(x, data)
axarr[0].set_ylabel('$T_\mathrm{air,2,2}$', size=FONT_SIZE)
axarr[0].yaxis.set_major_locator(MaxNLocator(5))
axarr[0].yaxis.set_major_formatter(ScalarFormatter(useOffset=False))
axarr[0].tick_params(direction='out', labelsize=FONT_SIZE)
axarr[0].grid(which='major', alpha=0.5)
axarr[0].grid(which='minor', alpha=0.2)

data = conv_dryer
x = range(0, len(data))

axarr[1].scatter(x, data)
axarr[1].set_ylabel('$T_\mathrm{dryer,2,2}$', size=FONT_SIZE)
axarr[1].yaxis.set_major_locator(MaxNLocator(5))
axarr[1].yaxis.set_major_formatter(ScalarFormatter(useOffset=False))
axarr[1].tick_params(direction='out', labelsize=FONT_SIZE)
axarr[1].grid(which='major', alpha=0.5)
axarr[1].grid(which='minor', alpha=0.2)

data = conv_lambda
x = range(0, len(data))

axarr[2].scatter(x, data)
axarr[2].set_xlabel('Iterationsschritte', size=FONT_SIZE)
axarr[2].xaxis.set_major_locator(MaxNLocator(integer=True))
axarr[2].set_ylabel('$\lambda$', size=FONT_SIZE)
axarr[2].yaxis.set_major_formatter(ScalarFormatter(useOffset=False))
axarr[2].yaxis.set_major_locator(MaxNLocator(5))
axarr[2].tick_params(direction='out', labelsize=FONT_SIZE)
axarr[2].grid(which='major', alpha=0.5)
axarr[2].grid(which='minor', alpha=0.2)

Ответы

Ответ 1

См. соответствующую документацию в общем и .

from matplotlib.ticker import FormatStrFormatter

fig, ax = plt.subplots()

ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f'))

enter image description here

Ответ 2

Ответ выше, вероятно, правильный способ сделать это, но у меня не получилось.

Хакерский способ, который решил это для меня, был следующим:

ax = <whatever your plot is> 
# get the current labels 
labels = [item.get_text() for item in ax.get_xticklabels()]
# Beat them into submission and set them back again
ax.set_xticklabels([str(round(float(label), 2)) for label in labels])
# Show the plot, and go home to family 
plt.show()

Ответ 3

Если вы непосредственно работаете с matplotlib pyplot (plt) и если вы более знакомы со строкой формата нового стиля, вы можете попробовать это:

from matplotlib.ticker import StrMethodFormatter
plt.gca().yaxis.set_major_formatter(StrMethodFormatter('{x:,.0f}')) # No decimal places
plt.gca().yaxis.set_major_formatter(StrMethodFormatter('{x:,.2f}')) # 2 decimal places

Из документации:

класс matplotlib.ticker.StrMethodFormatter(fmt)

Используйте форматную строку нового стиля (как используется str.format()) для форматирования галочки.

Поле, используемое для значения, должно быть помечено как x, а поле, используемое для позиции, должно быть помечено как pos.

Ответ 4

В matplotlib 3.1 вы также можете использовать ticklabel_format. Для предотвращения научной нотации без смещений:

plt.gca().ticklabel_format(axis='both', style='plain', useOffset=False)