Я не могу понять, как повернуть текст по оси 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')
python
matplotlib
TMC
источник
источник
ha
(горизонтальное выравнивание)Ответы:
Это работает для меня:
источник
ax.plot(...)
plt.xticks(rotation=90)
Простой способ
Как описано здесь , в
matplotlib.pyplot
figure
классе есть существующий метод, который автоматически поворачивает даты в соответствии с вашей цифрой.Вы можете позвонить после того, как вы нанесете свои данные (то есть
ax.plot(dates,ydata)
:Если вам нужно отформатировать метки, перейдите по ссылке выше.
Объекты, не относящиеся к дате
В соответствии с комментарием Лангитара , метод, который я предложил для не-datetime
xticks
, не будет корректно обновляться при масштабировании и т. Д. Если это неdatetime
объект, используемый в качестве данных оси X, вы должны следовать ответу Томми :источник
Здесь много «правильных» ответов, но я добавлю еще один, поскольку я думаю, что некоторые детали опущены из нескольких. ОП запросил поворот на 90 градусов, но я изменю на 45 градусов, потому что, когда вы используете угол, который не равен нулю или 90, вы должны также изменить горизонтальное выравнивание; в противном случае ваши ярлыки будут смещены от центра и будут немного вводить в заблуждение (и я предполагаю, что многие люди, которые приезжают сюда, хотят повернуть оси в положение, отличное от 90).
Самый простой / наименьший код
Опция 1
Как упоминалось ранее, это может быть нежелательно, если вы предпочитаете объектно-ориентированный подход.
Вариант 2
Другой быстрый способ (он предназначен для объектов даты, но, кажется, работает на любом ярлыке; сомневаюсь, что это рекомендуется):
fig
вы обычно получаете от:fig = plt.figure()
fig, ax = plt.subplots()
fig = ax.figure
Объектно-ориентированный / Работа непосредственно с
ax
Вариант 3а
Если у вас есть список меток:
Вариант 3б
Если вы хотите получить список меток с текущего графика:
Вариант 4
Аналогично вышеописанному, но вместо этого выполните обход вручную.
Вариант 5
Мы все еще используем
pyplot
(какplt
) здесь, но это объектно-ориентированный, потому что мы изменяем свойство определенногоax
объекта.Вариант 6
Эта опция проста, но, AFAIK, вы не можете установить горизонтальное выравнивание этикетки таким образом, так что другой вариант может быть лучше, если ваш угол не равен 90.
Изменить: есть обсуждение этой конкретной "ошибки", и исправление потенциально планируется для
v3.2.0
: https://github.com/matplotlib/matplotlib/issues/13774источник
Попробуйте pyplot.setp. Я думаю, что вы могли бы сделать что-то вроде этого:
источник
Traceback (most recent call last): File "plotter.py", line 23, in <module> plt.setp(time, rotation=90) File "/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py", line 183, in setp ret = _setp(*args, **kwargs) File "/usr/lib64/python2.7/site-packages/matplotlib/artist.py", line 1199, in setp func = getattr(o, funcName) AttributeError: 'datetime.datetime' object has no attribute 'set_rotation'
setp(subplot(111).get_xticklabels(), rotation=90)
отлично работает с бэкэндом Qt4Agg. В моем случае он сбрасываетсяplt.hist()
, поэтому я вызываю его позже, ноplt.plot()
не сбрасываю, так что с вами все должно быть в порядке.locs, labels = plt.xticks() plt.setp(labels, rotation=90)
непосредственно перед этим,plt.plot(time, delay)
и он работал нормально.Отдельно от
это также возможно:
источник
plt.xticks(rotation=45) plt.savefig(nomefile,dpi=150, optimize=True) plt.clf()
Я придумал похожий пример. Опять же, ключевое слово поворота ... ну, это ключ.
источник
datetime
Мой ответ вдохновлен ответом cjohnson318, но я не хотел предоставлять жестко закодированный список ярлыков; Я хотел повернуть существующие метки:
источник
При использовании
plt
:В случае использования панд или морского ежа для построения графика, принимая в
ax
качестве осей для графика:Еще один способ сделать выше:
источник
for tick in ax.get_xticklabels(): tick.set_rotation(45)
сделал трюк для меня.Если вы хотите применить вращение к объекту оси, самый простой способ - использовать
tick_params
. Например.Ссылка на документацию Matplotlib здесь .
Это полезно, когда у вас есть массив осей, возвращаемых функцией
plt.subplots
, и это более удобно, чем использование,set_xticks
потому что в этом случае вам также необходимо установить метки тиков, а также удобнее, чем те, которые перебирают тики (по очевидным причинам)источник
pd_dataframe.plot().tick_params(axis='x', labelrotation=90)
,labelrotation=30
.источник
Это будет зависеть от того, что вы планируете.
Для панд и морских птиц, которые дают вам объект Оси:
Если вам нужно повернуть метки, вам также может понадобиться изменить размер шрифта, вы можете использовать
font_scale=1.0
это.источник
Поворот метки оси X на 90 градусов
источник
Самое простое решение - использовать:
но также
например, для дат я использовал вращение = 45 и дно = 0,20, но вы можете сделать некоторые тесты для ваших данных
источник