Plotly散点图按is_cutoff字段设置标记大小时不符合预期问题求助
问题成因
你使用color=color_group参数生成散点图时,Plotly Express会自动按照facilityname的取值将原始数据拆分为多个独立的trace(每个取值对应一个trace)。你调用fig.update_traces()时传入的marker.size是完整数据框长度的数组,但是每个trace只会按自身的数据点数量从该数组的头部截取对应长度的数值匹配到自己的点上,这就会出现数组索引和实际数据点不匹配的错位问题,最终导致部分is_cutoff=0的点错误匹配到了大尺寸的数值。
修复方案
最稳妥的方案是直接在px.scatter的参数中指定marker尺寸,避免全局update时的索引错位问题,调整后的代码如下:
首先提前在数据框中构造好对应每个点的marker尺寸列:
# 提前生成每个点对应的marker尺寸 plot_df['marker_size'] = np.where(plot_df['is_cutoff'] == 1, cutoff_marker_size, marker_size) client = ['av'] x_axis = 'recall_at_k' y_axis = 'precision_at_k' color_group='facilityname' graph_width = 1200 graph_height = 600 cutoff_marker_size = 18 symbol_group='rank_cutoff' text = 'info' title="test figure" fig = px.scatter( plot_df, x=x_axis, y=y_axis, color=color_group, size='marker_size', # 直接传入尺寸列 size_max=cutoff_marker_size, # 限定最大尺寸和你设置的阈值一致 title=title, width=graph_width, height=graph_height, text=text ) # 这里只需要设置marker的边框样式即可,不需要再指定size fig.update_traces(marker={'line':{'width':2, 'color':'DarkSlateGrey'}},textfont_size=1) fig.show()
如果你需要更精细的控制,也可以选择遍历每一个trace单独设置size:
# 其余代码保持不变,生成fig后替换update_traces的逻辑 for trace, facility in zip(fig.data, plot_df[color_group].unique()): # 筛选当前facility对应的is_cutoff值生成size数组 current_size = np.where(plot_df[plot_df[color_group]==facility]['is_cutoff']==1, cutoff_marker_size, marker_size) trace.marker.size = current_size trace.marker.line = {'width':2, 'color':'DarkSlateGrey'}
内容的提问来源于stack exchange,提问作者Madhur Yadav
相关产品推荐
相关产品推荐

