如何基于另一列值为Folium地图标记分配颜色?
解决方案
方法1:颜色映射字典直接分配
先给每个聚类标签绑定对应颜色,循环时直接取当前行标签对应的颜色值即可:
# 创建地图 m = folium.Map(location=[40, -90], zoom_start=4) # 定义6个聚类的颜色映射,可根据需求替换颜色 color_map = { 0: 'blue', 1: 'red', 2: 'green', 3: 'purple', 4: 'orange', 5: 'darkred' } # 遍历数据添加标记 for idx, row in df4.iterrows(): folium.Marker( location=[row['LAT'], row['LNG']], popup=str(row['uID']), # 通过Icon类设置标记颜色 icon=folium.Icon(color=color_map[row['cluster_label']]) ).add_to(m) # 显示地图 m
方法2:函数动态分配颜色
如果需要更灵活的颜色逻辑(比如自动适配聚类数量),可以用函数封装颜色分配规则:
# 创建地图 m = folium.Map(location=[40, -90], zoom_start=4) def get_cluster_color(label): # 定义颜色列表,数量对应聚类数 colors = ['blue', 'red', 'green', 'purple', 'orange', 'darkred'] # 标签超出范围时返回默认灰色 return colors[label] if label < len(colors) else 'gray' # 遍历添加标记 for idx, row in df4.iterrows(): marker_color = get_cluster_color(row['cluster_label']) folium.Marker( location=[row['LAT'], row['LNG']], popup=str(row['uID']), icon=folium.Icon(color=marker_color) ).add_to(m) # 显示地图 m
关键注意点
- 之前的报错是因为你把整个
df4['cluster_label'](Series对象)传给了颜色参数,而folium需要单个字符串格式的颜色值,必须取循环中当前行的标签值。 - folium的Marker本身没有
color参数,颜色需要通过folium.Icon类来设置,这是你之前尝试函数方案失败的核心原因。 - 用
iterrows()遍历数据行比range(len(df4))加iloc更简洁易读。
内容的提问来源于stack exchange,提问作者Jurassic_Question
相关产品推荐
相关产品推荐

