如何为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
相关产品推荐
相关产品推荐

