Подтвердить что ты не робот

Как установить xlabel в конце xaxis

Я хочу, чтобы моя ось x имела метку, подобную этому формату

0 1 2 3 4 5 Xlabel

но я пробую код ниже, он приводит меня в 2 строки

self.axes.set_xticks(np.arange(0,6,1))
self.axes.set_xlabel('Xlabel', fontsize=9,x=1,y=1)

= > мой результат: (

0 1 2 3 4 5 
        Xlabel 
4b9b3361

Ответ 1

При установке xlabel параметр x присваивает позицию в единицах оси, поэтому 0 - это начало координат, а 1 - правый край графика. y игнорируется, поскольку ожидается, что это значение по умолчанию, чуть ниже отметки галочки.

Чтобы отменить это поведение, вы можете установить положение в единицах оси с помощью метода Axis set_label_coords . Вы можете использовать другие единицы, также предоставляя преобразование.

Вот пример:

import matplotlib.pyplot as plt
import numpy as np

ax = plt.gca()
ax.set_xticks(np.arange(0,6,1))
label = ax.set_xlabel('Xlabel', fontsize = 9)
ax.xaxis.set_label_coords(1.05, -0.025)

plt.savefig('labelAtEnd.png')
plt.show()

В результате: enter image description here

Значение x (1,05) было выбрано для размещения метки вне рамки Axes. Значение y (-0,025) было выбрано как лучшее предположение для желаемой позиции. Используя преобразование, возможно автоматическое размещение текста в соответствии с метками Tick.

EDIT:

Вот расширенный пример с использованием преобразования. Нецелесообразно использовать последнее преобразование ticklabel, потому что оно не учитывает размер текста и то, как он выровнен. Чтобы получить несколько желаемый эффект, мне пришлось: 1) использовать один и тот же размер шрифта для моей метки x, 2) установить вертикальное выравнивание (va) на "верх", а 3) установить горизонтальное выравнивание на "левое". Преобразование для каждого тика устанавливается для единиц данных для x (потому что это xaxis) и единиц оси для y (от 0 до 1), но смещено фиксированным дополнением (в пикселях) от оси x.

import matplotlib.pyplot as plt
import numpy as np

ax = plt.gca()
ax.set_xticks(np.arange(0,6,1))
ax.set_yticks(np.arange(0,6,1))
label = ax.set_xlabel('xlabel', ha='left', va = 'top', )#fontsize = 9)

# need to draw the figure first to position the tick labels
fig = plt.gcf()
fig.draw(fig.canvas.get_renderer())

# get a tick and will position things next to the last one
ticklab = ax.xaxis.get_ticklabels()[0]
trans = ticklab.get_transform()
ax.xaxis.set_label_coords(5.1, 0, transform=trans)

plt.savefig('labelAtEnd2.png')
plt.show()

Это приводит к:

enter image description here

Ответ 2

В дополнение к тому, что уже сказал @Yann, на самом деле это проще сделать с помощью annotate. Он также будет оставаться в правильном положении при увеличении/увеличении.

import matplotlib.pyplot as plt
import matplotlib as mpl

ticklabelpad = mpl.rcParams['xtick.major.pad']

fig, ax = plt.subplots()
ax.set_xlim([0, 5])

# Add the label as annotation. The "5" is the padding betweent the right side
# of the axis and the label...
ax.annotate('XLabel', xy=(1,0), xytext=(5, -ticklabelpad), ha='left', va='top',
            xycoords='axes fraction', textcoords='offset points')

plt.show()

enter image description here

Ответ 3

Вот мой вариант использования метода @JoeKington. Я изменяю последнюю метку метки на имя оси. Сначала я устанавливаю последние тики на пустые строки, а затем использую annotate(). Я использовал annotate(), потому что мне нужно контролировать размер шрифта метки оси.

import numpy as np
import matplotlib.pyplot as plt

plt.xlim(50, 70)
plt.ylim(100, 250)

ax = plt.gca()
# clears last tick label
xticks = ax.get_xticks().tolist()
xticks[-1] = ''
ax.set_xticklabels(xticks)
yticks = ax.get_yticks().tolist()
yticks[-1] = ''
ax.set_yticklabels(yticks)
# sets axes labels on both ends
ax.annotate('$t$', xy=(0.98, 0), ha='left', va='top', xycoords='axes fraction', fontsize=20)
ax.annotate('$x$', xy=(0, 1), xytext=(-15,2), ha='left', va='top', xycoords='axes fraction', textcoords='offset points', fontsize=20)

plt.show(block=True)

Может быть, кто-то знает более элегантный способ сделать это, потому что это смехотворно сложная операция.

enter image description here

Ответ 4

Для людей, которые хотят называть оси и которые используют непосредственно plt, а не некоторые ax и fig:

plt.figure(figsize=(width, height))
plt.plot(x_list, y_list)
plt.xlabel('x axis name')
plt.ylabel('y axis name')
plt.title("Plot title")
plt.show()

Чтобы добавить к этому демонстрационному примеру, вот несколько практических примеров: https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition