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

Plotly技术问询:如何移除X轴上的空白日期?

解决Plotly柱状图X轴空白日期问题

嘿,我来帮你搞定这个X轴出现空白日期的问题!

你遇到的核心问题是:Plotly默认会把datetime类型的X轴当作连续时间序列处理,哪怕某些日期没有数据,也会在轴上自动填充空白位置。要让X轴只显示实际有数据的日期,我们可以通过两种简单方式实现:

方法1:把日期转成字符串类型

在分组聚合完成后,将Date列转换为字符串格式,这样Plotly就会把它当作离散的类别处理,不会补全空白日期:

import pandas as pd
import plotly.express as px

# 你的原始数据
data = [
    ["2019-06-03", "25M", 34], ["2019-06-03", "25M", 60], ["2019-06-03", "50M", 23],
    ["2019-06-04", "25M", 67], ["2019-06-05", "50M", -90], ["2019-06-05", "50M", 100],
    ["2019-06-06", "100M", 6], ["2019-06-07", "25M", -100], ["2019-06-08", "100M", 67],
    ["2019-06-09", "25M", 450], ["2019-06-10", "50M", 600], ["2019-06-11", "25M", -9],
    ["2019-07-12", "50M", 45], ["2019-07-13", "50M", 67], ["2019-07-14", "100M", 130],
    ["2019-07-14", "50M", 45], ["2019-07-15", "100M", 100], ["2019-07-16", "25M", -90],
    ["2019-07-17", "25M", 700], ["2019-07-18", "25M", -9]
]
df = pd.DataFrame(data, columns=["Date", "Category", "Sum"])

# 数据预处理步骤
df["Date"] = pd.to_datetime(df["Date"])  # 原代码format参数写错了,原始日期是YYYY-MM-DD,无需额外指定格式
df = df.sort_values(["Date","Category","Sum"], ascending=False)
df = round(df.groupby(["Date","Category"]).agg({"Sum":"sum"}).reset_index(), 1)

# 关键改动:将日期转换为字符串格式
df["Date"] = df["Date"].dt.strftime("%Y-%m-%d")

# 绘制图表
fig = px.bar(df, x="Date" , y='Sum', barmode="group", color="Category")
fig.update_xaxes(
    rangeslider_visible=True,
    rangeselector=dict(
        buttons=list([
            dict(count=1, label="day", step="day", stepmode="todate"),
            dict(count=1, label="monthly", step="month", stepmode="todate"),  # 修正原代码拼写错误:montly → monthly
            dict(count=1, label="year", step="year", stepmode="todate"),
            dict(step="all")
        ])
    ))
fig.show()

方法2:强制设置X轴为类别类型

如果你想保留Date的datetime类型,可以在更新X轴时指定type='category',强制轴显示离散的类别:

# 数据预处理步骤和上面一致,无需转字符串
fig = px.bar(df, x="Date" , y='Sum', barmode="group", color="Category")
fig.update_xaxes(
    type='category',  # 关键设置:把X轴设为类别类型
    rangeslider_visible=True,
    rangeselector=dict(
        buttons=list([
            dict(count=1, label="day", step="day", stepmode="todate"),
            dict(count=1, label="monthly", step="month", stepmode="todate"),
            dict(count=1, label="year", step="year", stepmode="todate"),
            dict(step="all")
        ])
    ))
fig.show()

额外小修正

顺便提一下你原代码里的两个小问题:

  • pd.to_datetime的format参数写错了,原始日期是YYYY-MM-DD格式,不需要指定format="%Y%m%d";
  • rangeselector里的按钮标签montly拼写错误,应该改成monthly。

这样修改后,X轴就只会显示你数据中实际存在的日期,不会再出现空白啦!

内容的提问来源于stack exchange,提问作者Amit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:02:44