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

如何为Geopandas绘制的风险等级地图指定自定义单值颜色

为Geopandas风险等级地图指定自定义单值颜色

问题描述

已实现结合CSV风险数据与Shapefile绘制风险等级地图,但需要为risk字段的1-4级分别指定绿色、黄色、橙色、红色自定义颜色。使用cmap参数(如"Reds")可正常渲染,但merged_df.plot(column="risk",colors = ['green','yellow','cyan','red'])代码无效,需解决自定义颜色映射问题。

附风险数据(Tmaxrisks.csv)

"District","risk"
"Berea",1
"Butha Buthe",3
"Leribe",1
"Mafeteng",2
"Maseru",1
"Mohale's Hoek",2
"Mokhotlong",4
"Qacha's Nek",3
"Quthing",3
"Thaba Tseka",4

原代码

import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt

map_df = gpd.read_file("Shapefiles/BNDA_LSO_1990-01-01_lastupdate/BNDA_LSO_1990-01-01_lastupdate.shx")

risks_df = pd.read_csv("Tmaxrisks.csv")

merged_df = map_df.merge(risks_df, left_on=["adm1nm"], right_on=["District"])

merged_df.plot(column="risk", cmap="Reds", legend=False)
#merged_df.plot(column="risk",colors = ['green','yellow','cyan','red'])

plt.show()

解决方案

当使用column参数指定数值列时,Geopandas会优先基于数值生成颜色映射,此时colors参数会被忽略。提供两种可行方案:

方案一:直接映射颜色列(无图例需求)

通过创建颜色映射字典,将risk值转换为对应颜色,再用color参数绘制:

import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt

map_df = gpd.read_file("Shapefiles/BNDA_LSO_1990-01-01_lastupdate/BNDA_LSO_1990-01-01_lastupdate.shx")
risks_df = pd.read_csv("Tmaxrisks.csv")
merged_df = map_df.merge(risks_df, left_on=["adm1nm"], right_on=["District"])

# 定义风险等级与颜色的对应关系
risk_color_map = {
    1: 'green',
    2: 'yellow',
    3: 'orange',
    4: 'red'
}

# 新增颜色列
merged_df['risk_color'] = merged_df['risk'].map(risk_color_map)

# 传入颜色列绘制地图
merged_df.plot(color=merged_df['risk_color'], legend=False)

plt.show()

方案二:使用自定义Colormap和Norm(保留图例)

适合需要显示风险等级图例的场景,通过ListedColormap和BoundaryNorm实现离散颜色映射:

import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap, BoundaryNorm

map_df = gpd.read_file("Shapefiles/BNDA_LSO_1990-01-01_lastupdate/BNDA_LSO_1990-01-01_lastupdate.shx")
risks_df = pd.read_csv("Tmaxrisks.csv")
merged_df = map_df.merge(risks_df, left_on=["adm1nm"], right_on=["District"])

# 定义自定义颜色列表
colors = ['green', 'yellow', 'orange', 'red']
# 设置边界值(需比风险等级数量多1,确保每个等级对应独立颜色区间)
bounds = [0.5, 1.5, 2.5, 3.5, 4.5]

# 创建自定义颜色映射和归一化规则
cmap = ListedColormap(colors)
norm = BoundaryNorm(bounds, cmap.N)

# 绘制地图并启用图例
merged_df.plot(column="risk", cmap=cmap, norm=norm, legend=True)

# 调整图例位置(可选)
ax = plt.gca()
legend = ax.get_legend()
legend.set_bbox_to_anchor((1.05, 1))

plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:57:47