Повернуть текст оси в python matplotlib

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

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

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

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

fig.autofmt_xdate()

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

Объекты без объекта

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

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

Ответ 3

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

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

Ответ 4

Appart from

plt.xticks(rotation=90)

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

plt.xticks(rotation='vertical')

Ответ 5

Я придумал аналогичный пример. Опять же, ключевое слово вращения... ну, это ключ.

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( ['tom','dick','harry'], rotation=45 ) ;

Ответ 6

Мой ответ вдохновлен ответом cjohnson318, но я не хотел поставлять жесткий список ярлыков; Я хотел повернуть существующие метки:

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

Ответ 7

При использовании plt:

plt.xticks(rotation=90)

В случае использования панд или морского дна для построения, считая ax качестве осей для сюжета:

ax.set_xticklabels(ax.get_xticklabels(), rotation=90)

Другой способ сделать это:

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

Ответ 8

Если вы хотите применить вращение к объекту осей, самый простой способ - использовать tick_params. Например.

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

Ссылка на документацию Matplotlib здесь.

Это полезно, когда у вас есть массив осей, возвращаемый plt.subplots, и это более удобно, чем использование set_xticks потому что в этом случае вам также необходимо установить метки тиков, а также удобнее, чем те, которые перебирают тики ( по понятным причинам)

Ответ 9

import pylab as pl
pl.xticks(rotation = 90)

Ответ 10

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

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

Опция 1

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

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

Вариант 2

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

fig.autofmt_xdate(rotation=45)

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

  • fig = plt.figure()
  • fig, ax = plt.subplots()
  • fig = ax.figure

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

Вариант 3а

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

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

Вариант 3б

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

# Unfortunately you need to draw your figure first to assign the labels,
# otherwise get_xticklabels() will return empty strings.
plt.draw()
ax.set_xticklabels(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

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

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

Изменить: Там обсуждение этой точной "ошибки", и исправление потенциально планируется для v3.2.0: https://github.com/matplotlib/matplotlib/issues/13774

Ответ 11

Это будет зависеть от того, что вы планируете.

import matplotlib.pyplot as plt

 x=['long_text_for_a_label_a',
    'long_text_for_a_label_b',
    'long_text_for_a_label_c']
y=[1,2,3]
myplot = plt.plot(x,y)
for item in myplot.axes.get_xticklabels():
    item.set_rotation(90)

Для панд и морского дна, которые дают вам объект Axes:

df = pd.DataFrame(x,y)
#pandas
myplot = df.plot.bar()
#seaborn 
myplotsns =sns.barplot(y='0',  x=df.index, data=df)
# you can get xticklabels without .axes cause the object are already a 
# isntance of it
for item in myplot.get_xticklabels():
    item.set_rotation(90)

Если вам нужно повернуть метки, вам может понадобиться изменить размер шрифта, вы можете использовать font_scale=1.0 для этого.

Ответ 12

Чтобы повернуть метку оси x на 90 градусов для отметки в ax.get_xticklabels(): tick.set_rotation (45)