Ответ 1
Это работает для меня:
plt.xticks(rotation=90)
Я не могу понять, как повернуть текст по оси 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')
Это работает для меня:
plt.xticks(rotation=90)
Простой способ
Как описанный здесь, в классе 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)
Попробуйте pyplot.setp. Я думаю, вы могли бы сделать что-то вроде этого:
x = range(len(time))
plt.xticks(x, time)
locs, labels = plt.xticks()
plt.setp(labels, rotation=90)
plt.plot(x, delay)
Appart from
plt.xticks(rotation=90)
это также возможно:
plt.xticks(rotation='vertical')
Я придумал аналогичный пример. Опять же, ключевое слово вращения... ну, это ключ.
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 ) ;
Мой ответ вдохновлен ответом cjohnson318, но я не хотел поставлять жесткий список ярлыков; Я хотел повернуть существующие метки:
for tick in ax.get_xticklabels():
tick.set_rotation(45)
При использовании plt
:
plt.xticks(rotation=90)
В случае использования панд или морского дна для построения, считая ax
качестве осей для сюжета:
ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
Другой способ сделать это:
for tick in ax.get_xticklabels():
tick.set_rotation(45)
Если вы хотите применить вращение к объекту осей, самый простой способ - использовать tick_params
. Например.
ax.tick_params(axis='x', labelrotation=90)
Ссылка на документацию Matplotlib здесь.
Это полезно, когда у вас есть массив осей, возвращаемый plt.subplots
, и это более удобно, чем использование set_xticks
потому что в этом случае вам также необходимо установить метки тиков, а также удобнее, чем те, которые перебирают тики ( по понятным причинам)
import pylab as pl
pl.xticks(rotation = 90)
Здесь много "правильных" ответов, но я добавлю еще один, поскольку я думаю, что некоторые детали опущены из нескольких. ОП запросил поворот на 90 градусов, но я изменю на 45 градусов, потому что когда вы используете угол, который не равен нулю или 90, вы должны также изменить горизонтальное выравнивание; в противном случае ваши ярлыки будут смещены от центра и будут немного вводить в заблуждение (и я предполагаю, что многие люди, которые приходят сюда, хотят повернуть оси на что-то отличное от 90).
plt.xticks(rotation=45, ha='right')
Как упоминалось ранее, это может быть нежелательно, если вы предпочитаете объектно-ориентированный подход.
Другой быстрый способ (он предназначен для объектов даты, но, похоже, работает на любом ярлыке; сомневаюсь, что это рекомендуется):
fig.autofmt_xdate(rotation=45)
fig
вы обычно получаете от:
fig = plt.figure()
fig, ax = plt.subplots()
fig = ax.figure
ax
Если у вас есть список меток:
labels = ['One', 'Two', 'Three']
ax.set_xticklabels(labels, rotation=45, ha='right')
Если вы хотите получить список меток с текущего графика:
# 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')
Аналогично вышеописанному, но вместо этого выполните обход вручную.
for label in ax.get_xticklabels():
label.set_rotation(45)
label.set_ha('right')
Мы все еще используем pyplot
(как plt
) здесь, но он объектно-ориентированный, потому что мы меняем свойство конкретного объекта ax
.
plt.setp(ax.get_xticklabels(), rotation=45, ha='right')
Эта опция проста, но, AFAIK, вы не можете установить горизонтальное выравнивание этикетки таким образом, так что другой вариант может быть лучше, если ваш угол не равен 90.
ax.tick_params(axis='x', labelrotation=45)
Изменить: Там обсуждение этой точной "ошибки", и исправление потенциально планируется для v3.2.0
: https://github.com/matplotlib/matplotlib/issues/13774
Это будет зависеть от того, что вы планируете.
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
для этого.
Чтобы повернуть метку оси x на 90 градусов для отметки в ax.get_xticklabels(): tick.set_rotation (45)