Использование datetime в качестве тиков в Matplotlib

Я в основном пытаюсь построить график, где ось x представляет месяц года. Данные хранятся в numpy.array с размерами kx months . Здесь он следует за минимальным примером (мои данные не такие сумасшедшие):

 import numpy import matplotlib import matplotlib.pyplot as plt cmap = plt.get_cmap('Set3') colors = [cmap(i) for i in numpy.linspace(0, 1, len(complaints))] data = numpy.random.rand(18,12) y = range(data.shape[1]) plt.figure(figsize=(15, 7), dpi=200) for i in range(data.shape[0]): plt.plot(y, data[i,:], color=colors[i], linewidth=5) plt.legend(loc='center left', bbox_to_anchor=(1, 0.5)) plt.xticks(numpy.arange(0, 12, 1)) plt.xlabel('Hour of the Day') plt.ylabel('Number of Complaints') plt.title('Number of Complaints per Hour in 2015') 

введите описание изображения здесь

  • Python - конвертировать дату в ISO 8601
  • как получить имя дня в datetime в python
  • преобразовать строку в объект datetime
  • Запрос Mongodb по месяцам, дням, годам ... datetime
  • Фильтрация даты на оси x с помощью matplotlib Python
  • Как я могу указать период (AM / PM) с datetime.strptime?
  • Я бы хотел, чтобы xticks строками вместо чисел. Мне интересно, нужно ли мне создавать список строк вручную или если есть другой способ перевода чисел в несколько месяцев. Например, я должен сделать то же самое для будних дней.

    Я смотрел на эти примеры:

    http://matplotlib.org/examples/pylab_examples/finance_demo.html http://matplotlib.org/examples/pylab_examples/date_demo2.html

    Но я не использую datetime .

  • Ноутбук IPython перестает оценивать ячейки после plt.show ()
  • Как построить данные из нескольких текстовых файлов с двумя столбцами с легендами в Matplotlib?
  • Дублировать предметы в легенде в matplotlib?
  • Значок смещения временной зоны, измененный Python dateutil?
  • Использование событий с matplotlib в цикле for
  • Удалить строку через маркер в легенде matplotlib
  • 2 Solutions collect form web for “Использование datetime в качестве тиков в Matplotlib”

    Это альтернативный метод построения plot_date , который вы можете использовать, если ваша независимая переменная используется как datetime , вместо использования более общего метода построения plot :

     import datetime data = np.random.rand(24) #a list of time: 00:00:00 to 23:00:00 times = [datetime.datetime.strptime(str(i), '%H') for i in range(24)] #'H' controls xticklabel format, 'H' means only the hours is shown #day, year, week, month, etc are not shown plt.plot_date(times, data, fmt='H') plt.setp(plt.gca().xaxis.get_majorticklabels(), 'rotation', 90) 

    введите описание изображения здесь

    Преимущество этого заключается в том, что теперь вы можете легко контролировать плотность xticks, если мы хотим иметь галочку каждый час, мы plot_date эти строки после plot_date :

     ##import it if not already imported #import matplotlib.dates as mdates plt.gca().xaxis.set_major_locator(mdates.HourLocator()) 

    введите описание изображения здесь

    Вы можете использовать форматировщики для форматирования ваших результатов так, как вы хотите. Например, чтобы напечатать месячные имена, давайте сначала определим функцию с целым числом до аббревиатуры месяца:

     def getMonthName(month_number): testdate=datetime.date(2010,int(month_number),1) return testdate.strftime('%b') 

    Здесь я создал произвольную дату с правильным месяцем и вернулся в этом месяце. Проверьте документацию datetime на наличие доступных кодов формата, если это необходимо. Если это всегда проще, чем просто задать список вручную, это еще один вопрос. Теперь давайте построим несколько ежемесячных тестовых данных:

     import matplotlib.pyplot as plt import matplotlib.ticker as mtick import numpy as np x_data=np.arange(1,12.5,1) y_data=x_data**2 # Just some arbitrary data plt.plot(x_data,y_data) plt.gca().xaxis.set_major_locator(mtick.FixedLocator(x_data)) # Set tick locations plt.gca().xaxis.set_major_formatter(mtick.FuncFormatter(lambda x,p:getMonthName(x))) plt.show() 

    Сообщение здесь состоит в том, что вы можете использовать matplotlib.ticker.FuncFormatter чтобы использовать любую функцию для получения метки метки. Функция принимает два аргумента (значение и позиция) и возвращает строку.

    Python - лучший язык программирования в мире.