Python中Plotly未遵守预设颜色字典:Streamlit聚类可视化交互颜色变动问题
问题根因
你当前使用的color_continuous_scale是连续色阶配置,Plotly会自动根据当前传入数据中聚类编号的最大、最小值拉伸色阶范围,因此聚类数量变化时,同一个编号对应的色阶位置会发生偏移,最终导致颜色变化。
最优解决方案
直接使用Plotly的离散颜色映射参数color_discrete_map,硬绑定每个聚类编号和对应颜色,不需要手动裁剪颜色列表,只要聚类编号不变,颜色就不会变动。
修改后可用的代码如下:
def plot_model(cluster_model): cluster_color_dict = { 1:'yellow', 2:'CornflowerBlue', 3:'orange', 4:'green', 5:'black', 6:'fuchsia', 7:'red', 8:'aqua', 9:'deepskyblue', 10:'greenyellow' } # 将聚类列转为分类类型,避免Plotly将其识别为连续数值 cluster_model['Clusters'] = cluster_model['Clusters'].astype('category') fig = px.scatter_3d(cluster_model, x='NPHI', y='RHOZ', z='GR', color='Clusters', # 传入预定义的颜色映射字典 color_discrete_map=cluster_color_dict) fig.update_layout(margin=dict(l=0, r=0, b=0, t=0)) fig.update_traces(marker_size=3) return fig
备选方案(保留连续色阶效果)
如果你需要保留连续色阶的展示样式,可以固定色阶的映射范围,避免自动拉伸,调整代码如下:
def plot_model(cluster_model): cluster_color_dict = { 1:'yellow', 2:'CornflowerBlue', 3:'orange', 4:'green', 5:'black', 6:'fuchsia', 7:'red', 8:'aqua', 9:'deepskyblue', 10:'greenyellow' } fig = px.scatter_3d(cluster_model, x='NPHI', y='RHOZ', z='GR', color='Clusters', color_continuous_scale=list(cluster_color_dict.values()), # 固定色阶的映射范围为1到最大支持聚类数10 range_color=[1,10]) fig.update_layout(margin=dict(l=0, r=0, b=0, t=0)) fig.update_traces(marker_size=3) return fig
注意事项
- 如果后续需要支持超过10个聚类,提前在
cluster_color_dict中补充对应的颜色键值对即可。 - 确保
cluster_color_dict的键类型和数据中Clusters列的类型完全匹配,比如列值为字符串时,键也要定义为字符串类型。
内容的提问来源于stack exchange,提问作者Francisco Colina
相关产品推荐
相关产品推荐

