Python Метки оси X в формате Matplotlib (1) равны кварталу года и (2) устанавливают Major_locator в конце месяца - PullRequest
1 голос
/ 12 февраля 2020

Я хочу сделать две вещи:

  1. Я хочу отформатировать ось X, чтобы иметь четверти. Мои данные временных рядов приведены в кварталах. Так, например, для даты 2012-12-31 я хочу, чтобы она отображалась как 2012Q4, для 2013-03-31 как 2013Q1, для 2013-03-30 как 2013Q2 и так далее. Я могу использовать
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))

, чтобы установить формат. Но я не мог найти способ установить его на четверти. pandas имеет Q, (pandas формат datetimeindex в четверти ), но здесь это не сработало. Как мне это сделать?

Я хочу, чтобы основной локатор тиков был в конце квартала. Я мог бы использовать этот код (см. Ниже), чтобы установить его на 30-й день каждого месяца / квартала, но я не могу понять, как установить его на последний день каждого месяца / квартала, поскольку июнь, заканчивающийся в конце квартала, заканчивается 30-го числа, в то время как квартал, заканчивающийся маршем, заканчивается 31-го числа.
dayloc = mdates.MonthLocator(bymonth=(3,6,9,12),bymonthday=30)
ax.xaxis.set_major_locator(dayloc)

Полный код для генерации данных и графика приведен ниже:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime
from datetime import timedelta

from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

dti = pd.date_range('2012-12-31', periods=30, freq='Q')
s1 = pd.Series(range(30),index=dti)
s2 = pd.Series(np.random.randint(100,1000,size=(30)),index=dti)

df = s2.to_frame(name='count')
print(df)
f1 = plt.figure("Quarterly",figsize=(10,5))
ax = plt.subplot(1,1,1)
dayloc = mdates.MonthLocator(bymonth=(3,6,9,12),bymonthday=30)
ax.xaxis.set_major_locator(dayloc)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))

y= [datetime.date(t) for t in df.index]
z= [datetime.date(t).replace(day=1)+timedelta(days=0) for t in df.index]
widths = [t1-t0-timedelta(days=0) for t0,t1 in zip(z,y)]

ax.bar(y,df['count'],width=widths)
plt.setp(ax.get_xticklabels(), rotation=90)
f1.tight_layout()
f1.show()
input()

1 Ответ

3 голосов
/ 12 февраля 2020

Попробуйте вместо этого, используя pd.DataFrame.to_period и pandas сюжет:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime
from datetime import timedelta
%matplotlib inline

from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

dti = pd.date_range('2012-12-31', periods=30, freq='Q')
s1 = pd.Series(range(30),index=dti)
s2 = pd.Series(np.random.randint(100,1000,size=(30)),index=dti)

df = s2.to_frame(name='count')
df = df.to_period(freq='Q')
print(df)
f1 = plt.figure("Quarterly",figsize=(10,5))
ax = plt.subplot(1,1,1)
# dayloc = mdates.MonthLocator([3,6,9,12])
# ax.xaxis.set_major_locator(dayloc)
# ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))

# y= [datetime.date(t) for t in df.index]
# z= [datetime.date(t).replace(day=1)+timedelta(days=0) for t in df.index]
# widths = [t1-t0-timedelta(days=0) for t0,t1 in zip(z,y)]

# ax.bar(y,df['count'],width=widths)
df.plot.bar(ax=ax)
plt.setp(ax.get_xticklabels(), rotation=90)
f1.tight_layout()

Вывод: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...