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

使用Folium创建ColorLine时触发TypeError错误的求助

Folium ColorLine 报错:字符串类型无法执行减法运算的解决方法

问题描述

我尝试用一组经纬度坐标创建ColorLine,代码如下:

map_object = folium.Map(location=[15.235683, 75.167737], zoom_control=True, zoom_start = 10, control_scale=True)
coordinates = [(15.564746,74.819551), (15.392602,75.173812),(15.392602,75.173812),(15.413797,74.735791)]
color=['red','green','blue']  # 长度应为len(coordinates)-1
line = features.ColorLine(coordinates,colors = color , weight= 10)
line.add_to(map_object)

执行时出现以下报错:

Traceback (most recent call last):
  File "<xxx>\Interactive maps\main.py", line 12, in <module>       
    line = features.ColorLine(coordinates,colors = color , weight= 10)
  File "<xxx>\Python39\lib\site-packages\folium\features.py", line 1892, in __init__
    if colormap is None:
  File "<xxx>\Python39\lib\site-packages\branca\colormap.py", line 235, in __init__
    self.index = [vmin + (vmax-vmin)*i*1./(n-1) for i in range(n)]
  File "<xxx>\Python39\lib\site-packages\branca\colormap.py", line 235, in <listcomp>
    self.index = [vmin + (vmax-vmin)*i*1./(n-1) for i in range(n)]
TypeError: unsupported operand type(s) for -: 'str' and 'str'

我明白这是因为vmin和vmax是字符串类型,无法执行减法运算,但不知如何解决。这是否是Folium包的bug?

我尝试过将colors参数修改为字符串和字符串列表。根据colormap.py中LinearColormap类的说明,我预期传入颜色字符串应该能被处理,其说明如下:

colors : list-like object with at least two colors.
...
...
* a color name or shortcut (e.g: "y" or "yellow")

解决方法

这不是Folium的bug,而是对ColorLine参数用法的误解:ColorLine的colors参数不能直接传入固定颜色列表,它是配合values参数实现「数值-颜色」映射的色阶。如果需要给每段线段指定固定颜色,有两种可行方案:

方案一:用PolyLine分段添加(最直接)

循环遍历每一段坐标对,为每段单独创建PolyLine并指定颜色:

import folium
from folium import features

map_object = folium.Map(location=[15.235683, 75.167737], zoom_control=True, zoom_start=10, control_scale=True)
coordinates = [(15.564746,74.819551), (15.392602,75.173812),(15.392602,75.173812),(15.413797,74.735791)]
colors = ['red','green','blue']

# 为每一段线段添加对应颜色的PolyLine
for i in range(len(coordinates)-1):
    folium.PolyLine(
        locations=[coordinates[i], coordinates[i+1]],
        color=colors[i],
        weight=10
    ).add_to(map_object)

# 保存地图到本地
map_object.save('segmented_map.html')

方案二:正确使用ColorLine(基于数值映射)

如果一定要用ColorLine,需要为每段线段分配对应数值,通过色阶映射到指定颜色:

import folium
from folium import features
from branca.colormap import LinearColormap

map_object = folium.Map(location=[15.235683, 75.167737], zoom_control=True, zoom_start=10, control_scale=True)
coordinates = [(15.564746,74.819551), (15.392602,75.173812),(15.392602,75.173812),(15.413797,74.735791)]
# 为每段线段分配唯一数值
values = [0, 1, 2]
# 创建对应数值范围的色阶
colormap = LinearColormap(colors=['red','green','blue'], vmin=min(values), vmax=max(values))

line = features.ColorLine(
    coordinates,
    values=values,
    colormap=colormap,
    weight=10
)
line.add_to(map_object)

map_object.save('colorline_map.html')

报错原因说明

当你直接将颜色列表传给ColorLine的colors参数时,Folium会默认把它当作数值列表来计算vmin和vmax,自然会把字符串类型的颜色名当作数值处理,从而触发「字符串无法做减法」的错误。LinearColormap的说明里提到的colors是色阶的颜色列表,但ColorLine需要结合数值来使用这个色阶,而非直接指定每段颜色。

内容的提问来源于stack exchange,提问作者Jose25X

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:27:36