Plotly Scattergeo自定义颜色映射异常:所有点显示黑色求助
问题原因及解决方法
问题根源
你当前的代码存在两个关键问题:
- 颜色变量定义语法错误:
colors colors=('#1e90ff','#ff8c00','#2e8b57')是无效语法,正确写法应为colors = ('#1e90ff','#ff8c00','#2e8b57')。 - 直接将原始类别整数赋值给
marker_color时,Plotly会把这些数值当作连续数值处理,而非离散类别,无法匹配你指定的颜色列表,最终导致所有点显示为默认黑色。
修正方案
要让不同类别对应指定颜色,需要把类别值映射到你定义的颜色列表索引,再为每个点分配对应颜色:
步骤1:修正颜色变量定义
先修复语法错误:
colors = ('#1e90ff','#ff8c00','#2e8b57')
步骤2:将类别映射为颜色索引
如果naics_two的取值不是0、1、2这类刚好对应颜色列表索引的数值,用pd.factorize把它转成从0开始的连续索引:
category_indices, _ = pd.factorize(combined_frame['naics_two'])
步骤3:为每个点分配对应颜色
修改Scattergeo的marker设置,通过列表推导式生成每个点的颜色:
fig = go.Figure(data=go.Scattergeo( lon = combined_frame['lon'], lat = combined_frame['lat'], text = combined_frame['tenant_name'] + '<br>' + combined_frame['facility_name'], mode = 'markers', marker = dict( color = [colors[i] for i in category_indices], size = 8 # 可选,调整点的显示大小 ) ))
完整修正代码
import plotly.graph_objects as go import pandas as pd import numpy as np # 修正颜色变量定义 colors = ('#1e90ff','#ff8c00','#2e8b57') # 将naics_two类别转成颜色列表的索引 category_indices, _ = pd.factorize(combined_frame['naics_two']) fig = go.Figure(data=go.Scattergeo( lon = combined_frame['lon'], lat = combined_frame['lat'], text = combined_frame['tenant_name'] + '<br>' + combined_frame['facility_name'], mode = 'markers', marker = dict( color = [colors[i] for i in category_indices], size = 8 ) )) fig.update_layout( title = 'Facility Locations<br>(Hover for tenant and facility names)', geo_scope='usa', showlegend=True # 开启图例,可根据需求调整 ) fig.show()
补充说明
- 若
naics_two的类别数量和颜色列表长度不匹配,需要确保颜色列表包含所有类别的颜色,或者添加默认颜色逻辑。 - 若要通过
update_traces方法设置颜色,同样需要先生成每个点对应的颜色列表再传入:
fig.update_traces(marker=dict(color=[colors[i] for i in category_indices]))
内容的提问来源于stack exchange,提问作者Drew Burrier
相关产品推荐
相关产品推荐

