如何避免Matplotlib柱状图出现多余日期刻度与标签
Matplotlib柱状图X轴日期异常问题解决
问题描述
运行指定代码绘制柱状图时,X轴出现多余的2023-05-09日期,且目标日期2023-05-10至2023-05-13重复显示,但筛选后的DataFrame及原始CSV中无异常数据。需要让X轴仅显示目标日期且每个日期仅出现一次,同时兼容现有BigQuery、SQL的日期处理逻辑。
运行代码
import os import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates current_dir = os.path.dirname(os.path.abspath(__file__)) csv_path = os.path.join(current_dir, "CSV\\") df = pd.DataFrame() df = df.append(pd.read_csv(csv_path + "MainData.csv"), sort=False) periodB4 = "'2023-05-10' AND '2023-05-13'" def makeStartEndDates(x): start_date, end_date = x.split(' AND ') start_date = start_date.strip() end_date = end_date.strip() return [start_date, end_date] start_date_b4, end_date_b4 = makeStartEndDates(periodB4) selected_df = df.iloc[:-5, :] selected_df['date'] = pd.to_datetime(selected_df['date'], format='%Y-%m-%d') b4period = selected_df.loc[selected_df['date'].between(start_date_b4, end_date_b4)] # print(b4period) plt.bar(b4period['date'], b4period['dau']) plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) plt.xticks(rotation=90) plt.xlabel('Category') plt.ylabel('Value') plt.title('Bar Chart Example') plt.tight_layout() plt.savefig('chart.png')
筛选后的DataFrame数据
{'date': [Timestamp('2023-05-10 00:00:00'), Timestamp('2023-05-11 00:00:00'), Timestamp('2023-05-12 00:00:00'), Timestamp('2023-05-13 00:00:00')], 'new_users': [2885.0, 2954.0, 3160.0, 4086.0], 'dau': [8627.0, 9112.0, 9318.0, 9327.0], 'wau': [28542.0, 28542.0, 28542.0, 28542.0]}
解决方案
问题根源是Matplotlib默认自动生成日期刻度时,会基于数据范围扩展出多余刻度或重复显示。只需手动指定X轴刻度为筛选后DataFrame中的日期即可解决,且完全不影响原有SQL/BigQuery的日期处理逻辑。
关键修改
将原代码中的plt.xticks(rotation=90)替换为:
# 手动指定X轴刻度为数据中存在的日期 plt.xticks(b4period['date'], rotation=90)
也可以通过gca()方式设置:
ax = plt.gca() ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) # 绑定数据中的日期作为刻度 ax.set_xticks(b4period['date']) plt.xticks(rotation=90)
完整修改后代码
import os import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates current_dir = os.path.dirname(os.path.abspath(__file__)) csv_path = os.path.join(current_dir, "CSV\\") df = pd.DataFrame() df = df.append(pd.read_csv(csv_path + "MainData.csv"), sort=False) periodB4 = "'2023-05-10' AND '2023-05-13'" def makeStartEndDates(x): start_date, end_date = x.split(' AND ') start_date = start_date.strip() end_date = end_date.strip() return [start_date, end_date] start_date_b4, end_date_b4 = makeStartEndDates(periodB4) selected_df = df.iloc[:-5, :] selected_df['date'] = pd.to_datetime(selected_df['date'], format='%Y-%m-%d') b4period = selected_df.loc[selected_df['date'].between(start_date_b4, end_date_b4)] plt.bar(b4period['date'], b4period['dau']) plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) # 手动指定X轴刻度为数据中的日期 plt.xticks(b4period['date'], rotation=90) plt.xlabel('Date') plt.ylabel('DAU') plt.title('DAU Bar Chart (2023-05-10 to 2023-05-13)') plt.tight_layout() plt.savefig('chart.png')
说明
- 手动绑定
xticks为b4period['date'],确保X轴仅显示数据中存在的日期,彻底避免自动生成多余或重复刻度。 - 原有适配SQL/BigQuery的
periodB4处理逻辑完全保留,无需修改,不影响数据筛选流程。
内容的提问来源于stack exchange,提问作者Gwinbleid
相关产品推荐
相关产品推荐

