Вопрос-Ответ

Rotate axis tick labels

Метки отметок оси поворота

Я не могу понять, как повернуть текст по оси X. Это временная метка, поэтому по мере увеличения количества выборок они становятся все ближе и ближе, пока не перекрываются. Я хотел бы повернуть текст на 90 градусов, чтобы по мере приближения образцов друг к другу они не перекрывались.

Ниже то, что у меня есть, работает нормально, за исключением того, что я не могу понять, как повернуть текст по оси X.

import sys

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import datetime

font = {'family' : 'normal',
'weight' : 'bold',
'size' : 8}

matplotlib.rc('font', **font)

values = open('stats.csv', 'r').readlines()

time = [datetime.datetime.fromtimestamp(float(i.split(',')[0].strip())) for i in values[1:]]
delay = [float(i.split(',')[1].strip()) for i in values[1:]]

plt.plot(time, delay)
plt.grid(b='on')

plt.savefig('test.png')
Переведено автоматически
Ответ 1

У меня это работает:

plt.xticks(rotation=90)
Ответ 2

Здесь много "правильных" ответов, но я добавлю еще один, так как я думаю, что некоторые детали упущены из нескольких. OP запросил поворот на 90 градусов, но я изменю на 45 градусов, потому что, когда вы используете угол, отличный от нуля или 90, вам также следует изменить выравнивание по горизонтали; в противном случае ваши метки будут смещены от центра и немного вводят в заблуждение (и я предполагаю, что многие люди, которые приходят сюда, хотят повернуть оси на что-то другое, чем 90).

Самый простой / Наименьший код

Вариант 1

plt.xticks(rotation=45, ha='right')

Как упоминалось ранее, это может быть нежелательно, если вы предпочитаете объектно-ориентированный подход.

Вариант 2

Еще один быстрый способ (он предназначен для объектов даты, но, похоже, работает с любой меткой; сомневаюсь, что это рекомендуется):

fig.autofmt_xdate(rotation=45)

fig обычно вы получаете из:


  • fig = plt.gcf()

  • fig = plt.figure()

  • fig, ax = plt.subplots()

  • fig = ax.figure

Объектно-ориентированный / Имеет дело непосредственно с ax

Вариант 3a

Если у вас есть список меток:

labels = ['One', 'Two', 'Three']
ax.set_xticks([1, 2, 3])
ax.set_xticklabels(labels, rotation=45, ha='right')

В более поздних версиях Matplotlib (3.5+) вы можете просто использовать set_xticks самостоятельно:

ax.set_xticks([1, 2, 3], labels, rotation=45, ha='right')

Вариант 3b

Если вы хотите получить список меток с текущего графика:

# Unfortunately you need to draw your figure first to assign the labels,
# otherwise get_xticklabels() will return empty strings.
plt.draw()
ax.set_xticks(ax.get_xticks())
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha='right')

Как и выше, в более поздних версиях Matplotlib (3.5+) вы можете просто использовать set_xticks самостоятельно:

ax.set_xticks(ax.get_xticks(), ax.get_xticklabels(), rotation=45, ha='right')

Вариант 4

Аналогично описанному выше, но вместо этого выполняйте цикл вручную.

for label in ax.get_xticklabels():
label.set_rotation(45)
label.set_ha('right')

Вариант 5

Мы по-прежнему используем здесь pyplot (as plt), но он объектно-ориентированный, потому что мы изменяем свойство определенного ax объекта.

plt.setp(ax.get_xticklabels(), rotation=45, ha='right')

Вариант 6

Этот параметр прост, но AFAIK вы не можете настроить выравнивание метки по горизонтали таким образом, поэтому другой вариант может быть лучше, если ваш угол не равен 90.

ax.tick_params(axis='x', labelrotation=45)

Редактировать:
Обсуждается именно эта "ошибка", но исправление не выпущено (по состоянию на 3.4.0):
https://github.com/matplotlib/matplotlib/issues/13774

Ответ 3

Простой способ

Как описано здесь, в matplotlib.pyplot figure классе существует существующий метод, который автоматически поворачивает даты соответствующим образом для вашего рисунка.

Вы можете вызвать это после построения графика ваших данных (т.е.ax.plot(dates,ydata) :

fig.autofmt_xdate()

Если вам нужно дополнительно отформатировать метки, перейдите по ссылке выше.

Объекты, отличные от datetime

Согласно комментарию languitar, метод, который я предложил для не-datetime xticks, не будет корректно обновляться при масштабировании и т.д. Если это не datetime объект, используемый в качестве ваших данных по оси x, вам следует следовать ответу Tommy:

for tick in ax.get_xticklabels():
tick.set_rotation(45)
Ответ 4

Попробуйте pyplot.setp. Я думаю, вы могли бы сделать что-то вроде этого:

x = range(len(time))
plt.xticks(x, time)
locs, labels = plt.xticks()
plt.setp(labels, rotation=90)
plt.plot(x, delay)
python matplotlib