使用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
相关产品推荐
相关产品推荐

