folium绘制多段行程轨迹时不同行程颜色无法正确区分的问题
问题背景
需求为在folium地图上绘制多段独立行程,每段行程使用独立颜色区分。
初始实现代码如下:
import random def triptracer(df): df=df.reset_index() color1 = ["#"+''.join([random.choice('0123456789ABCDEF') for j in range(6)])] this_map = folium.Map(prefer_canvas=True) for i in range(df.shape[0]-1): if((df['tripId'][i] == df['tripId'][i+1]) ): folium.CircleMarker(location=[df['latitude'][i],df['longitude'][i]],color = color1 ,radius=2,weight=2).add_to(this_map) else : color1 = ["#"+''.join([random.choice('0123456789ABCDEF') for j in range(6)])] this_map.fit_bounds(this_map.get_bounds()) return this_map
使用的数据集包含tripId、longitude、latitude三个字段,共包含58个不同tripId对应的行程,数据样例如下:
tripId longitude latitude 1869715 9.961366 48.425659 1869715 9.961353 48.425614 1869715 9.961239 48.425626 1869715 9.961211 48.425686 1869715 9.960998 48.425712 ... ... ... ... 1862514 9.939702 48.416177 1862514 9.939587 48.416041 1862514 9.939507 48.415924 1862514 9.939213 48.415989 1862514 9.938921 48.415984
运行代码后可视化结果仅能识别出8种不同颜色的行程,与预期不符。
代码存在的核心逻辑问题
- 颜色参数类型错误:不管是初始化还是后续更新的
color1,都被定义为单元素列表(例如["#FF0000"]),但folium的CircleMarker的color参数需要接收字符串格式的颜色值。传入列表会导致前端渲染时无法识别非法颜色值,自动回退使用folium内置的默认8色循环调色板,这就是58段行程只显示8种颜色的根本原因。 - 点位大面积遗漏:循环范围设置为
range(df.shape[0]-1),仅遍历到倒数第二行数据,整个数据集的最后一个点位永远不会被绘制;同时当遍历到相邻两行tripId不一致(即行程切换点)时,仅更新颜色,不绘制当前i位置的点位,导致每段行程的最后一个点位全部丢失。 - 颜色分配逻辑不可靠:没有提前为每个唯一
tripId预绑定固定颜色,仅靠相邻行tripId是否相等判断换色,一旦数据集没有提前按tripId排序,会出现同一段行程被拆分分配多个颜色、不同行程复用颜色的问题。
修正后的代码
import random import folium def triptracer(df): # 先按tripId排序,避免同行程点位被拆分 df = df.sort_values('tripId').reset_index(drop=True) # 提前为每个唯一tripId分配独立的字符串格式颜色 trip_color_map = {} for trip_id in df['tripId'].unique(): random_color = "#"+''.join([random.choice('0123456789ABCDEF') for _ in range(6)]) trip_color_map[trip_id] = random_color this_map = folium.Map(prefer_canvas=True) # 遍历所有点位,不遗漏最后一个点 for i in range(df.shape[0]): current_trip = df['tripId'][i] folium.CircleMarker( location=[df['latitude'][i], df['longitude'][i]], color=trip_color_map[current_trip], # 传入符合参数要求的字符串色值 radius=2, weight=2 ).add_to(this_map) this_map.fit_bounds(this_map.get_bounds()) return this_map
修正逻辑说明:提前为每个行程ID绑定固定颜色,从根源避免颜色错配;去掉颜色变量外层的列表,传入符合要求的字符串格式色值;补全所有点位的绘制,增加排序逻辑保证同行程点位连续。
内容的提问来源于stack exchange,提问作者MayaGina
相关产品推荐
相关产品推荐

