У меня возникла проблема, пытаясь повернуть мои отметки даты в matplotlib. Небольшой пример программы приведен ниже. Если я попытаюсь повернуть тики в конце, тики не повернуты. Если я попытаюсь повернуть галочки, как показано в комментарии «crashes», то происходит сбой matplot lib.
Это происходит только в том случае, если значения х являются датами. Если я заменим переменную dates
на переменную t
в вызове avail_plot
, xticks(rotation=70)
вызов работает очень хорошо внутри avail_plot
.
Любые идеи?
import numpy as np
import matplotlib.pyplot as plt
import datetime as dt
def avail_plot(ax, x, y, label, lcolor):
ax.plot(x,y,'b')
ax.set_ylabel(label, rotation='horizontal', color=lcolor)
ax.get_yaxis().set_ticks([])
#crashes
#plt.xticks(rotation=70)
ax2 = ax.twinx()
ax2.plot(x, [1 for a in y], 'b')
ax2.get_yaxis().set_ticks([])
ax2.set_ylabel('testing')
f, axs = plt.subplots(2, sharex=True, sharey=True)
t = np.arange(0.01, 5, 1)
s1 = np.exp(t)
start = dt.datetime.now()
dates=[]
for val in t:
next_val = start + dt.timedelta(0,val)
dates.append(next_val)
start = next_val
avail_plot(axs[0], dates, s1, 'testing', 'green')
avail_plot(axs[1], dates, s1, 'testing2', 'red')
plt.subplots_adjust(hspace=0, bottom=0.3)
plt.yticks([0.5,],("",""))
#doesn't crash, but does not rotate the xticks
#plt.xticks(rotation=70)
plt.show()
python
matplotlib
Нил
источник
источник
Ответы:
Если вы предпочитаете не объектно-ориентированный подход, перед двумя вызовами перейдите
plt.xticks(rotation=70)
вправо , напримерavail_plot
Это устанавливает свойство поворота перед настройкой меток. Так как у вас есть две оси здесь,
plt.xticks
запутывается после того, как вы сделали два графика. В тот момент , когдаplt.xticks
ничего не делать,plt.gca()
ничего не дадут вам оси , которые вы хотите изменить, и такplt.xticks
, что действует на текущих осях, не будет работать.Если объектно-ориентированный подход не используется
plt.xticks
, вы можете использоватьпосле двух
avail_plot
звонков. Это устанавливает вращение на правильные оси специально.источник
plt.setp
вы можете установить несколько параметров, указав их в качестве дополнительных аргументов ключевого слова.horizontalalignment
kwarg особенно полезно , когда вы повернете клещ этикетку:plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70, horizontalalignment='right' )
ax.tick_params(axis='x', rotation=70)
в любое место.plt.setp
раствор полностью объектно - ориентированным. Если вам не нравится тот факт, что он естьplt
, используйтеfrom matplotlib.artist import setp; setp(ax.get_xticklabels(), rotation=90)
вместо этого.plt.xticks
pyplot. Сама документация говорит не смешивать стили.plt.setp
более многословный, но не типичный объектно-ориентированный стиль. Ваш ответ определенно лучший здесь. По сути, все, что с функцией, не является объектно-ориентированным. Неважно, импортируете выsetp
или нет.yticks
, и в коде вообще не определен топор внеavail_plot
...Решение работает для matplotlib 2.1+
Существует метод осей,
tick_params
который может изменять свойства тиков. Он также существует как метод осиset_tick_params
Или
В качестве примечания, текущее решение смешивает интерфейс с состоянием (используя pyplot) с объектно-ориентированным интерфейсом с помощью команды
plt.xticks(rotation=70)
. Поскольку в рассматриваемом коде используется объектно-ориентированный подход, лучше всего придерживаться этого подхода. Решение действительно дает хорошее явное решение сplt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )
источник
Простое решение, которое позволяет избежать зацикливания на ярлыках, состоит в том, чтобы просто использовать
fig.autofmt_xdate()
Эта команда автоматически поворачивает метки оси и регулирует их положение. Значениями по умолчанию являются угол поворота 30 ° и горизонтальное выравнивание «вправо». Но они могут быть изменены в вызове функции
Дополнительный
bottom
аргумент эквивалентен настройкеplt.subplots_adjust(bottom=bottom)
, которая позволяет установить отступ нижних осей на большее значение для размещения повернутых меток.Так что в основном здесь у вас есть все настройки, которые вам нужны, чтобы иметь красивую ось даты в одной команде.
Хороший пример можно найти на странице Matplotlib.
источник
plt.setp
подход, либо перебрать галочки (что по сути то же самое).twinx
), это приводит к нарушению выравнивания между метками и метками. В этом случае решение Теда Петру лучше.Другой способ применения
horizontalalignment
иrotation
для каждой метки тиков - этоfor
цикл над метками тиков, которые вы хотите изменить:И вот пример, если вы хотите контролировать расположение основных и второстепенных тиков:
источник
Просто используйте
источник