Plotly动画散点图报name属性需为字符串错误如何解决?
Plotly动画散点图Timestamp类型报错解决方案
问题原因
- 直接原因:Plotly要求动画帧(
animation_frame参数指定的字段)的展示名称必须是字符串或可直接转为字符串的数字,你传入的字段值为pandas Timestamp时间类型,无法直接用作动画帧标签,触发报错。 - 隐藏问题:你配置了
log_x=True,但x轴字段Exp_Month为datetime64时间类型,时间值不支持对数运算,即使解决动画帧问题也会触发其他报错。
解决方案
根据你的业务需求选择对应方案即可:
方案1:以时间字段为动画帧,保留时间作为x/y轴
先将用作动画帧的时间字段转为字符串格式,同时移除x轴对数配置,适配时间轴特性:
import plotly.express as px # 将时间类型的动画帧字段转为字符串格式,此处以你报错中的2020-01-01对应的时间字段为例,替换为你实际要用作动画帧的字段 df_geo['anim_frame'] = df_geo['Exp_Month'].dt.strftime('%Y-%m') fig = px.scatter(df_geo, x="Exp_Month", y="Rev_Month", animation_frame="anim_frame", animation_group="Site_Name", size="Volume", color="Market", hover_name="Market", size_max=55, range_y=[2,100000]) fig.show()
方案2:以Volume为动画帧,保留x轴对数刻度
将x/y轴的时间字段转为数值类型(如月份序数、时间戳),同时提前校验Volume字段类型是否统一为float:
import plotly.express as px # 校验Volume字段是否混有异常时间值,输出应为只有float类型 print(df_geo['Volume'].apply(type).unique()) # 将时间字段转为数值,此处以距离最小日期的月份数为例 min_month = df_geo['Exp_Month'].min() df_geo['Exp_Month_num'] = (df_geo['Exp_Month'].dt.year - min_month.year)*12 + df_geo['Exp_Month'].dt.month df_geo['Rev_Month_num'] = (df_geo['Rev_Month'].dt.year - min_month.year)*12 + df_geo['Rev_Month'].dt.month # 绘图 fig = px.scatter(df_geo, x="Exp_Month_num", y="Rev_Month_num", animation_frame="Volume", animation_group="Site_Name", size="Volume", color="Market", hover_name="Market", log_x=True, size_max=55, range_x=[1,100], range_y=[1,100]) fig.show()
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

