如何让Matplotlib报表柱状图X轴仅显示实际存在的日期?
问题:Matplotlib柱状图X轴显示冗余日期
我有一份记录报表调用次数的DataFrame,已按报表名称和日期完成数据汇总,但使用Matplotlib绘制柱状图时,X轴始终显示大量不存在数据的冗余日期。
示例数据:
8 ADOSperrenVK.avx" 2023-04-17 7278 9 ADOSperrenVK.avx" 2023-04-18 4591
当前使用的Python代码:
import pandas as pd import matplotlib.pyplot as plt from datetime import datetime # 转换日期格式 df['TimeStamp'] = pd.to_datetime(df['TimeStamp']) # 提取日期部分 df['Date'] = df['TimeStamp'].dt.date # 按报表和日期分组统计调用次数 df_grouped = df.groupby([df['Report'], df['Date']]).size().reset_index(name='count') # 筛选调用量Top10的报表 top_10_reports = df_grouped.groupby('Report').sum().nlargest(10, 'count').index.values df_top_10 = df_grouped[df_grouped['Report'].isin(top_10_reports)] unique_reports = df_top_10['Report'].unique().tolist() # 循环为每个报表绘制柱状图 for report in unique_reports: df_report = df_top_10[df_top_10['Report'] == report] # 绘制图表 x = pd.to_datetime(df_report['Date']) y = df_report['count'] plt.bar(x, y) plt.title(report) plt.xlabel('Date') plt.ylabel('Count') plt.xticks(rotation=45) plt.show()
当前图表的X轴会自动填充数据日期之间的空白日期,我需要修改代码让X轴只显示实际存在数据的日期。
解决方案
核心原因是Matplotlib处理datetime类型的X轴时,会根据日期范围自动生成连续刻度,而非仅使用数据中存在的日期。可以通过以下两种简单方法解决:
方法1:使用字符串格式的日期作为X轴
将日期转换为字符串类型,Matplotlib会直接用数据中的每一个日期作为刻度,不会生成冗余项。
修改绘图循环中的X轴定义部分:
# 替换原来的x = pd.to_datetime(df_report['Date']) x = df_report['Date'].astype(str)
方法2:手动指定datetime类型的X轴刻度
如果需要保留datetime类型的X轴(比如后续要做日期相关的扩展操作),可以手动设置刻度为数据中存在的日期,并自定义标签格式:
修改绘图循环中的代码:
x = pd.to_datetime(df_report['Date']) y = df_report['count'] plt.bar(x, y) plt.title(report) plt.xlabel('Date') plt.ylabel('Count') # 手动设置X轴刻度为数据中的日期 plt.xticks(ticks=x, labels=x.strftime('%Y-%m-%d'), rotation=45) plt.show()
内容的提问来源于stack exchange,提问作者Dominic Meyer
相关产品推荐
相关产品推荐

