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

