使用Matplotlib自定义色卡绘制Folium分级统计图时遇UnboundLocalError
解决geopandas.explore自定义颜色分级图时的UnboundLocalError错误
问题场景
使用geopandas.explore绘制分级统计图(choropleth map)时,传入自定义的LinearSegmentedColormap对象会触发UnboundLocalError: local variable 'binning' referenced before assignment错误,但使用预定义颜色(如cmap='Blues')时可正常运行。相关代码如下:
import geopandas as gpd import matplotlib.colors import folium color_list= matplotlib.colors.LinearSegmentedColormap.from_list('custom', [ "#e1f2f2", "#A8DCDC", "#115F5F"]) ventas_map= data.explore(column='ventas', scheme='Quantiles', cmap= color_list, tiles= 'OpenStreetMap', k=5, legend_kwds={'caption': 'ventas[$]','colorbar': True ,'scale': False}, name= 'ventas')
原因分析
geopandas.explore方法在处理字符串类型的预定义色板名称和自定义Colormap对象时逻辑不同:当传入自定义Colormap对象时,内部未正确初始化binning变量,导致报错。
解决方法
将自定义Colormap注册到matplotlib的全局色板字典中,之后用注册的名称(字符串形式)传入cmap参数,即可和预定义色板一样正常工作。修改后的代码如下:
import geopandas as gpd import matplotlib.colors import folium import matplotlib.pyplot as plt # 创建自定义色板并注册到matplotlib custom_cmap = matplotlib.colors.LinearSegmentedColormap.from_list('custom', ["#e1f2f2", "#A8DCDC", "#115F5F"]) plt.register_cmap(cmap=custom_cmap) # 使用注册后的色板名称调用explore ventas_map = data.explore( column='ventas', scheme='Quantiles', cmap='custom', # 此处使用注册的字符串名称 tiles='OpenStreetMap', k=5, legend_kwds={'caption': 'ventas[$]', 'colorbar': True, 'scale': False}, name='ventas' )
另外,也可以尝试升级geopandas到最新版本,新版本可能修复了这个内部逻辑的bug。
内容的提问来源于stack exchange,提问作者Sofi1101
相关产品推荐
相关产品推荐

