6

Повернуть подписи отметок осей

4

Я не могу понять, как повернуть текст на оси 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 ответ(ов)

9

Это работает для меня:

plt.xticks(rotation=90)
4

Много "правильных" ответов здесь, но я добавлю еще один, поскольку, по моему мнению, в нескольких ответах упущены некоторые детали. Автор вопроса запрашивал вращение на 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

0

Попробуйте использовать 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 градусов, что может помочь улучшить читаемость надписей, особенно если они длинные.

0

Помимо использования

plt.xticks(rotation=90)

также возможно:

plt.xticks(rotation='vertical')

Оба способа позволяют повернуть подписи по оси X на 90 градусов, но второй вариант более читаем и может восприниматься как более интуитивный. Выберите тот, который вам удобнее использовать в вашем коде!

0

Ваш пример кода выглядит хорошо, и вы правы — ключевым моментом здесь является использование параметра 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 градусов. Это улучшает читаемость меток и делает их более аккуратными на графике, особенно если они длинные и могут пересекаться между собой.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь