Вращающиеся стрелки matplotlib [дубликат]

Так я буду делать это в DB2 SQL, я считаю, что RRN (относительный номер записи) хранится в таблице по O / S;

SELECT * FROM (                        
   SELECT RRN(FOO) AS RRN, FOO.*
   FROM FOO                         
   ORDER BY RRN(FOO)) BAR             
 WHERE BAR.RRN = recordnumber
95
задан cge 4 May 2015 в 03:39
поделиться

4 ответа

Если вы предпочитаете не объектно-ориентированный подход, переместите plt.xticks (rotation = 70) вправо перед двумя вызовами avail_plot, например

plt.xticks(rotation=70)
avail_plot(axs[0], dates, s1, 'testing', 'green')
avail_plot(axs[1], dates, s1, 'testing2', 'red')

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

Для объектно-ориентированного подхода, не использующего plt.xticks, вы можете использовать

plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )

после два вызова avail_plot. Это задает вращение в соответствующих точках.

157
ответ дан cge 22 August 2018 в 07:17
поделиться
  • 1
    Еще одна удобная вещь: когда вы вызываете plt.setp, вы можете установить несколько параметров, указав их как дополнительные аргументы ключевых слов. horizontalalignment kwarg особенно полезен, когда вы поворачиваете метки тика: plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70, horizontalalignment='right' ) – 8one6 4 August 2015 в 12:54
  • 2
    Мне не нравится это решение, так как оно смешивает pyplot и объектно-ориентированные подходы. Вы можете просто вызвать ax.tick_params(axis='x', rotation=70) в любом месте. – Ted Petrou 9 October 2017 в 17:41
  • 3
    @TedPetrou Что вы подразумеваете под «смешиванием»? Вот? решение plt.setp полностью объектно-ориентированное. Если вам не нравится тот факт, что в нем есть plt, вместо этого используйте from matplotlib.artist import setp; setp(ax.get_xticklabels(), rotation=90). – ImportanceOfBeingErnest 9 October 2017 в 19:29
  • 4
    @ImportanceOfBeingErnest В первой строке кода используется plt.xticks, который является pyplot. Сама документация говорит не смешивать стили. plt.setp является более подробным, но не типичным объектно-ориентированным стилем. Ваш ответ определенно лучший здесь. В принципе, ничего с функцией не является объектно-ориентированной. Неважно, импортируете ли вы setp или нет. – Ted Petrou 9 October 2017 в 19:37
  • 5
    Большая часть кода вопроса использует pyplot, например yticks, и код не имеет топора, определенного вне avail_plot ... – cge 9 October 2017 в 19:43

Простое решение, которое позволяет избежать циклирования над ticklabes, это просто использовать

fig.autofmt_xdate()

Эта команда автоматически поворачивает метки xaxis и настраивает их должность. Значения по умолчанию представляют собой угол поворота 30 ° и горизонтальное выравнивание «вправо». Но они могут быть изменены в вызове функции

fig.autofmt_xdate(bottom=0.2, rotation=30, ha='right')

Дополнительный аргумент bottom эквивалентен настройке plt.subplots_adjust(bottom=bottom), что позволяет установить нижнее значение просадки на большее значение для размещения повернутых меток .

Итак, в основном здесь у вас есть все настройки, которые вам нужны, чтобы иметь хорошую ось даты в одной команде.

Хороший пример можно найти на страница matplotlib.

23
ответ дан ImportanceOfBeingErnest 22 August 2018 в 07:17
поделиться

Другой способ применения horizontalalignment и rotation к каждому тик-метке делает цикл for над метками метки, которые вы хотите изменить:

import numpy as np
import matplotlib.pyplot as plt
import datetime as dt

now = dt.datetime.now()
hours = [now + dt.timedelta(minutes=x) for x in np.arange(0,24*60,10)]
days = [now + dt.timedelta(days=x) for x in np.arange(0,30,1/4.)]
hours_value = np.random.random(len(hours))
days_value = np.random.random(len(days))

fig, axs = plt.subplots(2)
fig.subplots_adjust(hspace=0.75)
axs[0].plot(hours,hours_value)
axs[1].plot(days,days_value)

for label in axs[0].get_xmajorticklabels() + axs[1].get_xmajorticklabels():
    label.set_rotation(30)
    label.set_horizontalalignment("right")

И вот пример, если вы хотите контролировать расположение основных и второстепенных тиков:

import numpy as np
import matplotlib.pyplot as plt
import datetime as dt

fig, axs = plt.subplots(2)
fig.subplots_adjust(hspace=0.75)
now = dt.datetime.now()
hours = [now + dt.timedelta(minutes=x) for x in np.arange(0,24*60,10)]
days = [now + dt.timedelta(days=x) for x in np.arange(0,30,1/4.)]

axs[0].plot(hours,np.random.random(len(hours)))
x_major_lct = mpl.dates.AutoDateLocator(minticks=2,maxticks=10, interval_multiples=True)
x_minor_lct = matplotlib.dates.HourLocator(byhour = range(0,25,1))
x_fmt = matplotlib.dates.AutoDateFormatter(x_major_lct)
axs[0].xaxis.set_major_locator(x_major_lct)
axs[0].xaxis.set_minor_locator(x_minor_lct)
axs[0].xaxis.set_major_formatter(x_fmt)
axs[0].set_xlabel("minor ticks set to every hour, major ticks start with 00:00")

axs[1].plot(days,np.random.random(len(days)))
x_major_lct = mpl.dates.AutoDateLocator(minticks=2,maxticks=10, interval_multiples=True)
x_minor_lct = matplotlib.dates.DayLocator(bymonthday = range(0,32,1))
x_fmt = matplotlib.dates.AutoDateFormatter(x_major_lct)
axs[1].xaxis.set_major_locator(x_major_lct)
axs[1].xaxis.set_minor_locator(x_minor_lct)
axs[1].xaxis.set_major_formatter(x_fmt)
axs[1].set_xlabel("minor ticks set to every day, major ticks show first day of month")
for label in axs[0].get_xmajorticklabels() + axs[1].get_xmajorticklabels():
    label.set_rotation(30)
    label.set_horizontalalignment("right")

7
ответ дан Pablo Reyes 22 August 2018 в 07:17
поделиться

Решение работает для matplotlib 2.1 +

Существует метод осей tick_params, который может изменять свойства тика. Он также существует как метод оси как set_tick_params

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

Или

ax.xaxis.set_tick_params(rotation=45)

. В качестве побочного примечания, текущее решение смешивает интерфейс состояния (с использованием pyplot) с объектно-ориентированного интерфейса с помощью команды plt.xticks(rotation=70). Поскольку код в вопросе использует объектно-ориентированный подход, лучше всего придерживаться этого подхода. Решение действительно дает хорошее явное решение с plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )

22
ответ дан Ted Petrou 22 August 2018 в 07:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: