Plotly气泡散点图传入color参数后标记尺寸显示异常
当你给px.scatter()传入字符串类型的分类字段作为color参数时,Plotly Express 会自动按分类值把原始数据拆成多个独立trace,每个分类对应一个trace,每个trace仅包含对应分类下的样本点。
你后续调用fig.update_traces()给所有trace统一传入全量df['Cycle life']作为marker尺寸值时,每个trace只会按自身内部的点顺序,截取尺寸数组前N个值(N为该分类的样本数),不会和原始数据行做匹配,直接导致尺寸和点错位,呈现出随机错乱的效果。
你排查到的「传入数值类型color时尺寸正常、移除color时尺寸正常」刚好能印证这个逻辑:这两种场景下Plotly不会拆分多trace,整个图只有1个trace,点顺序和原始DataFrame完全一致,传入全量size数组刚好能一一对应,所以显示正常。
所有和数据列映射相关的参数(包括尺寸、颜色、悬浮提示、标签等),不要等图生成后再通过update_traces传全量数据列,直接在px.scatter()初始化时传入即可,Plotly会在拆分trace时自动完成每个点的参数匹配,不会出现错位。
修正后的最简代码:
import plotly.express as px fig = px.scatter( data, x='Specific Energy (Wh/kg)', y='Cycle life', color='Category', size='Cycle life', # 直接传入尺寸对应的字段名 size_max=30, # 对应你之前sizeref计算逻辑里的最大标记尺寸,可按需调整 ) fig.show()
如果需要自定义sizemode、sizemin等细节参数,可以在初始化后再更新,这时候不会出现错位:
fig = px.scatter( data, x='Specific Energy (Wh/kg)', y='Cycle life', color='Category', size='Cycle life', size_max=30, ) fig.update_traces( marker_sizemode='area', marker_sizemin=2 ) fig.show()
踩坑提示:只要用Plotly Express绘图,涉及数据列到视觉属性的映射,都优先在px绘图函数的入参里传字段名,不要手动传整列数据给update_traces,只要触发分类拆分多trace的逻辑,就会出现索引不匹配的问题。
内容的提问来源于stack exchange,提问作者sirlod

