You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 17:17:38