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
相关产品推荐
相关产品推荐

