Повернуть подписи отметок осей
Я не могу понять, как повернуть текст на оси X. У меня есть временная метка, и по мере увеличения количества выборок метки все ближе и ближе подходят друг к другу, пока не начинают overlap'оваться. Я хотел бы повернуть текст на 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')
Как я могу решить эту проблему?
5 ответ(ов)
Это работает для меня:
plt.xticks(rotation=90)
Много "правильных" ответов здесь, но я добавлю еще один, поскольку, по моему мнению, в нескольких ответах упущены некоторые детали. Автор вопроса запрашивал вращение на 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 = ['Один', 'Два', 'Три']
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
Если вы хотите получить список меток из текущего графика:
# К сожалению, вам нужно сначала нарисовать фигуру, чтобы присвоить метки,
# в противном случае get_xticklabels() вернет пустые строки.
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
(как plt
), но это объектно-ориентированный метод, потому что мы изменяем свойства конкретного объекта ax
.
plt.setp(ax.get_xticklabels(), rotation=45, ha='right')
Вариант 6
Этот вариант прост, но, насколько я знаю, вы не можете установить горизонтальное выравнивание меток таким образом, поэтому другой вариант может быть лучше, если ваш угол не равен 90.
ax.tick_params(axis='x', labelrotation=45)
Правка:
Существует обсуждение этой самой "ошибки", но исправление еще не выпущено (по состоянию на 3.4.0
):
https://github.com/matplotlib/matplotlib/issues/13774
Попробуйте использовать pyplot.setp
. Вы можете сделать что-то подобное:
x = range(len(time))
plt.xticks(x, time)
locs, labels = plt.xticks()
plt.setp(labels, rotation=90)
plt.plot(x, delay)
Этот код устанавливает метки на оси X с поворотом на 90 градусов, что может помочь улучшить читаемость надписей, особенно если они длинные.
Помимо использования
plt.xticks(rotation=90)
также возможно:
plt.xticks(rotation='vertical')
Оба способа позволяют повернуть подписи по оси X на 90 градусов, но второй вариант более читаем и может восприниматься как более интуитивный. Выберите тот, который вам удобнее использовать в вашем коде!
Ваш пример кода выглядит хорошо, и вы правы — ключевым моментом здесь является использование параметра rotation
. Он позволяет изменять угол поворота меток на оси X, что может улучшить визуальное представление, особенно когда метки длинные или их много.
Вот эквивалентный перевод на русский:
from pylab import *
fig = figure()
ax = fig.add_subplot(111)
ax.bar([0, 1, 2], [1, 3, 5])
ax.set_xticks([0.5, 1.5, 2.5])
ax.set_xticklabels(['том', 'дик', 'гарри'], rotation=45);
Обратите внимание, что ключевой момент здесь — это использование параметра rotation=45
, который позволяет наклонить метки на 45 градусов. Это улучшает читаемость меток и делает их более аккуратными на графике, особенно если они длинные и могут пересекаться между собой.
Как задать размер шрифта заголовка фигуры и меток осей?
Изменение частоты делений по оси X или Y
Как вынести легенду за пределы графика
Сохранить график в файл изображения вместо его отображения
Как изменить размер шрифта на графике matplotlib