Matplotlib pyplot – контроль тика и дата показа

Мой matplotlib pyplot имеет слишком много xticks – в настоящее время он отображается каждый год и месяц на 15-летний период, например, «2001-01», но я хочу, чтобы ось x показывала год (например, 2001).

Выход будет линейным графиком, где ось x показывает даты, а ось y показывает цены продажи и аренды.

 # Defining the variables ts1 = prices['Month'] # eg. "2001-01" and so on ts2 = prices['Sale'] ts3 = prices['Rent'] # Reading '2001-01' as year and month ts1 = [dt.datetime.strptime(d,'%Y-%m').date() for d in ts1] plt.figure(figsize=(13, 9)) # Below is where it goes wrong. I don't know how to set xticks to show each year. plt.xticks(ts1, rotation='vertical') plt.xlabel('Year') plt.ylabel('Price') plt.plot(ts1, ts2, 'r-', ts1, ts3, 'b.-') plt.gcf().autofmt_xdate() plt.show() 

Вы можете сделать это с помощью plt.xticks .

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

 import numpy as np import matplotlib.pyplot as plt x = np.arange(10) y = np.random.randn(10) plt.plot(x,y) plt.xticks(np.arange(min(x), max(x)+1, 3)) plt.show() 

В вашем случае, поскольку вы используете даты, вы можете заменить аргумент второй на последнюю строку выше с чем-то вроде ts1[0::12] , который будет выбирать каждый 12-й элемент из ts1 или np.arange(0, len(dates), 12) который будет выбирать каждый 12-й индекс, соответствующий тикам, которые вы хотите показать.

Попробуйте полностью удалить plt.xticks функции plt.xticks . Затем matplotlib будет использовать функцию AutoDateLocator по умолчанию, чтобы найти оптимальные местоположения тика.

Альтернативно, если значение по умолчанию включает несколько месяцев, которые вы не хотите, вы можете использовать matplotlib.dates.YearLocator который заставит тики быть только годами.

Вы можете установить локатор, как показано ниже, в кратком примере:

 import matplotlib.pyplot as plt import matplotlib.dates as mdate import numpy as np import datetime as dt x = [dt.datetime.utcnow() + dt.timedelta(days=i) for i in range(1000)] y = range(len(x)) plt.plot(x, y) locator = mdate.YearLocator() plt.gca().xaxis.set_major_locator(locator) plt.gcf().autofmt_xdate() plt.show() 

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