Matplotlib - сделать x-тики в первый раз месяца на контурном графике - PullRequest
0 голосов
/ 16 апреля 2020

Проблема

У меня есть заполненный контурный график и некоторые данные временных рядов со временем по оси X и высотой по оси Y. Я сделал список даты и времени и могу заменить его галочками по оси X вместо списка чисел по умолчанию, который вместо этого обычно используется в качестве галочек. Это нормально и все, но я бы хотел, чтобы эти символы отображались в начале каждого месяца, а не каждые 30 дней. Я знаю, что есть функция MonthLocator в mpl.dates, но я не могу понять, как ее правильно использовать. Все примеры, которые я нахожу, используют линейные графики, а не контур, и оси работают по-разному для обоих.

Рабочий пример

#Modules

import numpy             as     np
import datetime          as     dt
import matplotlib.pyplot as     plt
from   matplotlib        import ticker
%matplotlib inline

#Data
data = np.random.randint(0,50,(10,61))
print(data.shape)
(10, 61)
#Dates
dates = []
base = dt.datetime(2000,1,1,1)
for i in range(len(data[1])):
    date      = base + dt.timedelta(days=i)
    dates.append(str(date.strftime("%-m/%-d/%-Y")))
print(dates[0], dates[-1])
('1/1/2000', '3/1/2000')
#Levels
levels = np.arange(1,len(data[1])+1)
clevels = np.arange(0,50,5)

#Figure
fig, ax = plt.subplots(figsize=(10, 5))
im      = ax.contourf(data,levels,levels=clevels,cmap='RdBu_r',extend='both')

#Axis customization
ax.set_xticklabels(dates)
plt.xticks(np.arange(len(dates))[::30],dates[::30])
ax.set_ylabel("Level")
cbar = plt.colorbar(im,values=clevels,pad=0.01)

enter image description here

Вопрос

Как сделать так, чтобы x-ticks строили графики первого дня каждого месяц вместо установленного интервала?

1 Ответ

1 голос
/ 16 апреля 2020

Вы можете установить основной локатор по оси x для использования matplotlib.dates.MonthLocator, но вы должны задать параметры X и Y для matplotlib.pyplot.contourf и массив X должен быть заполнен datetime, т. е.

import numpy as np
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
from matplotlib import ticker
from matplotlib.dates import MonthLocator, DateFormatter

data = np.random.randint(0, 50, (10, 61))
dates = [datetime.strptime('01-01-2000', '%m-%d-%Y') + timedelta(d) for d 
         in range(len(data[0]))]
clevels = np.arange(0, 50, 5)

fig, ax = plt.subplots(figsize=(10, 5))
im  = ax.contourf(dates, range(data.shape[0]), data, levels=clevels, 
                      cmap='RdBu_r', extend='both')

ax.set_ylabel("Level")
ax.xaxis.set_major_locator(MonthLocator())
ax.xaxis.set_major_formatter(DateFormatter("%m/%d/%Y"))
cbar = plt.colorbar(im, values=clevels, pad=0.01)
plt.show()

. После этого основные тики будут автоматически помещены в указанную дату каждого месяца (по умолчанию это первое число каждого месяца):

enter image description here

...