Plotly地图线条按DataFrame列值上色问题求助(含报错代码)
解决Plotly地图线条按DataFrame列值上色的问题
你现在的问题是想让地图上的线条根据TKB_Total列的值呈现渐变色彩,但当前用px.line_geo的方式因为数据结构和参数用法不对,导致报错或不生效。下面是可行的解决方案:
核心问题分析
你之前把所有线条的坐标拼接成带None分隔的大数组,这种结构适合绘制多条线,但px.line_geo的color参数如果传入整条线对应的数值,会因坐标点和颜色值长度不匹配出问题。更合适的方式是把每条线作为独立轨迹添加,这样可以给每条线单独设置对应TKB_Total值的颜色。
完整实现代码
import plotly.graph_objects as go import plotly.express as px import numpy as np # 假设你的DataFrame是mapa_TKB_coord,包含line(linestring)、O-D、TKB_Total列 # 1. 准备颜色刻度,采用反转后的RdBu渐变 color_scale = px.colors.sequential.RdBu[::-1] # 2. 获取TKB_Total的极值,用于颜色映射 min_tkb = mapa_TKB_coord['TKB_Total'].min() max_tkb = mapa_TKB_coord['TKB_Total'].max() fig = go.Figure() # 3. 遍历每条线路,逐个添加轨迹 for linestring, name, tkb_val in zip(mapa_TKB_coord['line'], mapa_TKB_coord['O-D'], mapa_TKB_coord['TKB_Total']): x, y = linestring.xy # 根据当前TKB值计算对应颜色 normalized_val = (tkb_val - min_tkb) / (max_tkb - min_tkb) line_color = px.colors.sample_colorscale(color_scale, normalized_val)[0] fig.add_trace(go.Scattergeo( lat=y, lon=x, hovertext=name, mode='lines', line=dict( color=line_color, width=2 # 可按需调整宽度,也可绑定TKB_Total值动态变化,比如width=tkb_val/max_tkb*5 ) )) # 4. 设置地图布局 fig.update_layout( geo=dict( projection_type='equirectangular' # 按需求选择投影类型 ), coloraxis=dict( colorscale=color_scale, cmin=min_tkb, cmax=max_tkb, colorbar=dict(title='TKB Total') ) ) fig.show()
关键说明
- 改用
plotly.graph_objects的Scattergeo逐个添加轨迹,每条线对应一个TKB_Total值,避免了坐标拼接带来的颜色匹配问题 - 用
px.colors.sample_colorscale实现数值到颜色的映射,自动适配你选择的渐变刻度 - 之前的
KeyError是因为px.line_geo的color参数无法处理拼接数组中的None值,以及颜色数组和坐标数组结构不匹配导致的
内容的提问来源于stack exchange,提问作者Edmar Santos
相关产品推荐
相关产品推荐

