使用DataFrame.plot.bar绘制柱状图时日期型xticks显示异常的解决
修复pandas堆叠柱状图日期轴显示整数的问题
当你用df.plot.bar(x="Date", stacked=True)绘制堆叠柱状图时,pandas会把日期列当作分类变量处理,x轴底层实际是从0开始的整数索引,所以ax.get_xticks()返回的是[0,1,2]这类值,而非日期对应的数值。要显示正确的日期,需要手动替换x轴的刻度标签,下面是两种可行的修复方法:
方法一:绘图后手动设置刻度标签
绘制柱状图后,获取当前x轴刻度位置,将对应的日期格式化为所需样式,再设置为刻度标签:
import matplotlib.pyplot as plt import datetime as dt import pandas as pd y = [dt.date(2021, 12, 12), dt.date(2022, 6, 12), dt.date(2023, 12, 12)] df = pd.DataFrame() df["Date"] = y df["V1"] = [0, 0.2, 0.8] df["V2"] = [0.4, 0.3, 0.3] # 绘制堆叠柱状图 ax = df.plot.bar(x="Date", stacked=True) # 设置x轴刻度标签为格式化后的日期 ax.set_xticklabels(df["Date"].dt.strftime("%Y-%m-%d"), rotation=45) # 调整布局防止标签被截断 plt.tight_layout() plt.show()
方法二:将日期设为索引后绘图
先把Date列设为DataFrame的索引,再绘制柱状图,配合matplotlib日期格式化工具优化显示:
import matplotlib.pyplot as plt import datetime as dt import pandas as pd from matplotlib.dates import DateFormatter y = [dt.date(2021, 12, 12), dt.date(2022, 6, 12), dt.date(2023, 12, 12)] df = pd.DataFrame() df["Date"] = y df["V1"] = [0, 0.2, 0.8] df["V2"] = [0.4, 0.3, 0.3] # 将Date设为索引 df.set_index("Date", inplace=True) # 绘制堆叠柱状图 ax = df.plot.bar(stacked=True) # 设置日期显示格式 date_form = DateFormatter("%Y-%m-%d") ax.xaxis.set_major_formatter(date_form) # 旋转标签避免重叠 plt.xticks(rotation=45) plt.tight_layout() plt.show()
补充说明
- 方法一更直接,适合快速调整;方法二更贴合pandas索引式绘图逻辑,方便后续对日期轴做更多自定义。
rotation=45用于避免日期标签过长重叠,tight_layout()自动调整图表布局,防止标签被截断。
内容的提问来源于stack exchange,提问作者Berkos
相关产品推荐
相关产品推荐

