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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:39:03