You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:09:18