2012-06-12 6 views
92

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

Ниже приведено то, что у меня есть, оно отлично работает, за исключением того, что я не могу понять, как поворачивать текст оси 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

См. [Этот ответ] (http://stackoverflow.com/a/14854007/2071807) для важного материала о выравнивании повернутых меток с 'ha' (горизонтальный выравнивание) – LondonRob

ответ

53

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

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

' Traceback (последний последний звонок): Файл «plotter.py», строка 23, в plt.setp (время, поворот = 90) Файл «/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py», строка 183, в setp ret = _setp (* args, ** kwargs) Файл "/usr/lib64/python2.7/site-packages/matplotlib/artist.py", строка 1199, в setp func = getattr (o, funcName) AttributeError: объект 'datetime.datetime' не имеет атрибута 'set_rotation' ' – tMC

+0

Я думаю, что я пропустил шаг e arlier. Помогает ли отредактированный пример? Хотя я далек от эксперта matplotlib, возможно, лучший способ. – opiethehokie

+1

Это вообще не работает. Изображение (на моей машине) полностью перепуталось. черные линии по всему выходному изображению ... Почти похоже на штрих-код. это очень странно. – tMC

31

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

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) ; 
+0

Похоже, что он работает, но он показывает время в секундах с момента эпохи, а не метку времени от 'datetime'. – tMC

99

Легкий способ

Как described here, есть существующий метод в matplotlib.pyplotfigure класса, который автоматически вращает даты соответственно для вас понять.

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

fig.autofmt_xdate() 

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

Non-DateTime объекты

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

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

Это лучший способ, потому что он лаконичен, он работает с существующими автоматически генерируемыми тиками и корректирует поля графика так, чтобы это читаемо. Другие методы позволяют галочкам покидать страницу, требуя дальнейших действий (например, plt.tight_layouts()) для их настройки. –

+0

Если вы использовали локатор и форматировщик, «другой» метод может нарушить их эффект, если он будет применен впоследствии. – languitar

+0

Наконец, обойти это. Спасибо @languitar. – ryanjdillon

25

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

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

Это, похоже, больше не работает. Нет никакого эффекта. – zbyszek

+5

Работает так, как ожидалось для меня. –

115

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

plt.xticks(rotation=90) 
+0

отлично, спасибо –

+2

Это должен быть принятый ответ – Eddy

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

Appart от

plt.xticks(rotation=90) 

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

plt.xticks(rotation='vertical') 
Смежные вопросы