为了账号安全,请及时绑定邮箱和手机立即绑定

Python Matplotlib (1) 将 x 轴标签格式化为 Year-Quarter

Python Matplotlib (1) 将 x 轴标签格式化为 Year-Quarter

白板的微信 2022-07-26 16:40:05
我想做两件事:我想将 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 格式设置为 Quarters),但这在这里不起作用。我该怎么做呢?我希望主要的刻度定位器在季度末。我可以使用此代码(见下文)将其设置为每个月/季度的第 30 天,但我无法弄清楚如何将其设置为每个月/季度的最后一天,因为截至 6 月的季度结束于 30 日,而3 月结束的季度于 31 日结束。dayloc = mdates.MonthLocator(bymonth=(3,6,9,12),bymonthday=30)ax.xaxis.set_major_locator(dayloc)生成数据和绘图的完整代码如下:import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport matplotlib.dates as mdatesfrom datetime import datetimefrom datetime import timedeltafrom pandas.plotting import register_matplotlib_convertersregister_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 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

试试这个,使用pd.DataFrame.to_period和熊猫情节:


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()

输出:

//img1.sycdn.imooc.com//62dfa8ac000176e807120350.jpg

查看完整回答
反对 回复 2022-07-26
  • 1 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号