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

如何在Plotly中绘制Timedelta误差棒(Streamlit环境)

问题:Plotly为日期类型Y轴添加误差棒失败

我在Streamlit中使用Plotly,想给数据添加误差棒。Y轴是日期类型,我有起始和结束日期,于是计算了时间差,再通过total_seconds() * 1000得到误差值,但这个方法无效,直接用Timedelta也不行。

我的代码如下:

df["date_finish"] = pd.to_datetime(df.date_finish)
df["date_start"] = pd.to_datetime(df.date_start)
df["date_delta"] = (df["date_finish"] - df["date_start"]) / 2
df["center_date"] = df["date_start"] + df["date_delta"]
df["date_error"] = df.date_delta.dt.total_seconds() * 1000
fig = px.scatter(
    df,
    x="my_data",
    y="center_date",
    color="categories",
    error_x="data_error",
    error_y="date_error",
)
st.plotly_chart(fig)

date_error的统计结果:

df.date_error.describe()
count    6.300000e+01
mean     3.099296e+06
std      2.830500e+05
min      2.801949e+06
25%      2.813138e+06
50%      3.113366e+06
75%      3.405682e+06
max      4.026567e+06

解决方法

Plotly的error_y参数在处理日期类型Y轴时,不支持直接传入毫秒数或Timedelta作为相对误差值,因为它会默认将传入数值当作日期本身解析,而非相对当前Y轴数据的偏移量。可以用以下两种方法解决:

方法1:直接指定误差的上下限日期

不用计算毫秒误差,直接把起始、结束日期作为误差的上下限传给Plotly:

df["date_finish"] = pd.to_datetime(df.date_finish)
df["date_start"] = pd.to_datetime(df.date_start)
df["center_date"] = df["date_start"] + (df["date_finish"] - df["date_start"]) / 2

fig = px.scatter(
    df,
    x="my_data",
    y="center_date",
    color="categories",
    error_x="data_error",
    # 直接用时间差指定误差上下限
    error_y_minus=df["center_date"] - df["date_start"],
    error_y_plus=df["date_finish"] - df["center_date"],
)
st.plotly_chart(fig)

这里error_y_minus和error_y_plus接受Timedelta类型,Plotly会自动适配日期轴的误差显示逻辑。

方法2:将日期转换为时间戳(数值)处理

把中心日期和误差都转换成Unix毫秒时间戳,用数值轴绘图后再将轴标签转回日期格式:

df["date_finish"] = pd.to_datetime(df.date_finish)
df["date_start"] = pd.to_datetime(df.date_start)
# 转换为毫秒时间戳
df["center_date_ts"] = df["date_start"].view('int64') // 10**6
df["date_error"] = ((df["date_finish"] - df["date_start"]) / 2).dt.total_seconds() * 1000

fig = px.scatter(
    df,
    x="my_data",
    y="center_date_ts",
    color="categories",
    error_x="data_error",
    error_y="date_error",
)
# 将Y轴从毫秒时间戳转回日期格式
fig.update_yaxes(
    tickformat="%Y-%m-%d %H:%M",
    tickvals=fig.data[0].y,
    ticktext=pd.to_datetime(fig.data[0].y, unit='ms').dt.strftime("%Y-%m-%d %H:%M")
)
st.plotly_chart(fig)

原方法失效原因

当Y轴是日期类型时,Plotly会将你传入的date_error毫秒值当作绝对日期值(比如3e6毫秒会被解析为1970-01-01 00:50:00),而非相对于center_date的误差偏移,因此无法显示正确的误差棒。

内容的提问来源于stack exchange,提问作者J Agustin Barrachina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:17:48