Plotly Express环形图customdata索引异常及格式化失效问题求助
嗨,我来帮你排查这个问题~你遇到的两个现象其实是同一个根源导致的:customdata没有被Plotly正确识别为多列数据,而是把每一行的三个值当成了一个单独的字符串,所以索引[1][2]自然找不到对应内容,格式化数字的操作也会因为字符串无法转成数值而返回NaN。
问题根源分析
你当前传递customdata=exceldf[['Live Price', 'Purchase Price', 'Quantity']].to_numpy()看起来没问题,但Plotly对于饼图(包括环形图)的customdata,有时候对numpy数组的识别会出现偏差,导致整行数据被序列化为逗号分隔的字符串,而不是拆分成独立的索引项。
解决方案
试试下面两种方法,应该能解决你的问题:
方法1:改用列表格式传递customdata
把numpy数组转成Python原生列表,Plotly对列表的兼容性更好:
donutchart.update_traces( customdata=exceldf[['Live Price', 'Purchase Price', 'Quantity']].values.tolist(), hovertemplate='Live Price: $%{customdata[0]:,.2f}<br>Purchase Price: $%{customdata[1]:,.2f}<br>Quantity: %{customdata[2]:,.0f}<extra></extra>' )
方法2:直接在px.pie中使用hover_data(修正你的错误用法)
你之前说用hover_data报错,应该是没配合hovertemplate正确使用。试试这种方式,更符合Plotly Express的设计逻辑:
donutchart = px.pie( exceldf, names='Ticker', values='Weight', hole=0.5, hover_data=['Live Price', 'Purchase Price', 'Quantity'] # 直接传入要显示的列名 ) donutchart.update_traces( hovertemplate='Ticker: %{label}<br>Weight: %{value}<br>Live Price: $%{customdata[0]:,.2f}<br>Purchase Price: $%{customdata[1]:,.2f}<br>Quantity: %{customdata[2]:,.0f}<extra></extra>' )
这样hover_data会自动把指定列的数据注入到customdata中,不需要手动转数组,而且格式会被正确识别。
额外验证小技巧
你可以先打印一下customdata的结构,确认是不是二维的:
print(exceldf[['Live Price', 'Purchase Price', 'Quantity']].values.tolist())
如果输出是类似[[100.5, 90.2, 5], [80.3, 75.1, 10]]这样的二维列表,那就是正确的结构,Plotly就能正确识别每个索引项。
当customdata结构正确后,你尝试的格式化语法$%{customdata[0]:,.2f}就会正常工作,不会再出现NaN啦~
备注:内容来源于stack exchange,提问作者NicolasToribio

