为何Matplotlib绘图时会自动添加日期?示例:2023-02-15
为什么Matplotlib绘图会自动显示带日的日期(如2023-02-15)?
原因分析
你用pd.to_datetime处理YearMonth列时,只指定了%Y%m的格式,Pandas会自动把日部分默认设为当月第一天(比如202302会转为2023-02-01),最终得到的是完整的datetime64类型数据。而Matplotlib的日期刻度渲染逻辑会根据数据的时间跨度自动选择刻度显示格式,当它认为需要填充刻度间隔时,就会生成中间日期(比如2023-02-15)作为刻度标签,这就出现了你看到的带日的日期。
解决办法
这里提供三种实用的处理方式:
自定义Matplotlib日期刻度格式
直接指定x轴刻度只显示年月,代码如下:import pandas as pd import matplotlib.pyplot as plt from matplotlib.dates import DateFormatter df = pd.DataFrame() df['YearMonth'] = [202303,202302,202301,202212,202211] df['total_burgers'] = [800,900,1200,1100,1000] df['YearMonth'] = pd.to_datetime(df['YearMonth'], format='%Y%m') fig, ax = plt.subplots() ax.plot(df['YearMonth'], df['total_burgers']) # 设置日期格式为「年-月」 date_formatter = DateFormatter("%Y-%m") ax.xaxis.set_major_formatter(date_formatter) # 旋转刻度标签避免重叠 plt.xticks(rotation=45) plt.show()将日期转为字符串作为x轴
如果不需要后续对日期做计算,直接把YearMonth转成年月字符串,这样Matplotlib就会按普通文本渲染刻度:import pandas as pd import matplotlib.pyplot as plt df = pd.DataFrame() df['YearMonth'] = [202303,202302,202301,202212,202211] df['total_burgers'] = [800,900,1200,1100,1000] # 转为「年-月」格式的字符串 df['YearMonth'] = df['YearMonth'].astype(str).apply(lambda x: f"{x[:4]}-{x[4:]}") plt.plot(df['YearMonth'], df['total_burgers']) plt.xticks(rotation=45) plt.show()使用Pandas内置绘图接口
Pandas的绘图工具对日期类型的处理更贴合日常需求,会自动优化刻度显示:import pandas as pd df = pd.DataFrame() df['YearMonth'] = [202303,202302,202301,202212,202211] df['total_burgers'] = [800,900,1200,1100,1000] df['YearMonth'] = pd.to_datetime(df['YearMonth'], format='%Y%m') df.plot(x='YearMonth', y='total_burgers', rot=45) plt.show()
内容的提问来源于stack exchange,提问作者Puzzlemaster
相关产品推荐
相关产品推荐

