如何为Geopandas绘图的Colormap添加自定义刻度标签?
为Geopandas地图的Colormap图例添加自定义刻度标记
你在使用Geopandas绘制带3色Colormap的地图时,尝试自定义图例刻度遇到了两种错误:
- 使用
legend_kwds={'ticks': ['Low','Medium','High']}触发TypeError: '<=' not supported between instances of 'numpy.ndarray' and 'numpy.ndarray' - 使用
cmap.ax.set_xticklabels(['Low', 'Medium', 'High'])触发AttributeError: 'LinearSegmentedColormap' object has no attribute 'ax'
错误原因分析
- 第一种错误是因为
ticks参数需要传入数值型刻度值,而非直接传入文本标签,Geopandas的图例需要先基于数据分箱的数值范围设置刻度位置,再替换为文本标签。 - 第二种错误是因为
cmap本身是颜色映射对象,并没有ax属性,操作图例需要获取图例的轴对象,而不是颜色映射对象。
正确实现方法
我们需要先获取绘图返回的图例对象,再通过修改图例轴的刻度标签来实现自定义文本:
import geopandas import matplotlib.cm as cm import matplotlib.pyplot as plt world = geopandas.read_file( geopandas.datasets.get_path('naturalearth_lowres') ) fig, ax = plt.subplots(1, 1) # 创建3色的PiYG颜色映射 cmap = cm.get_cmap('PiYG', 3) # 绘制地图,同时获取图例对象 world_plot = world.plot( column='pop_est', ax=ax, legend=True, cmap=cmap ) # 获取图例的轴对象并设置自定义刻度标签 cbar_ax = world_plot.get_legend().ax cbar_ax.set_yticklabels(['Low', 'Medium', 'High']) plt.show()
如果需要更精准地控制刻度位置,可以先计算数据分箱的边界,再指定刻度位置后替换标签:
import geopandas import matplotlib.cm as cm import matplotlib.pyplot as plt import numpy as np world = geopandas.read_file( geopandas.datasets.get_path('naturalearth_lowres') ) fig, ax = plt.subplots(1, 1) cmap = cm.get_cmap('PiYG', 3) # 计算人口数据的分箱边界 vmin, vmax = world['pop_est'].min(), world['pop_est'].max() bins = np.linspace(vmin, vmax, 4) # 取每个分箱的中间值作为刻度位置 tick_positions = (bins[:-1] + bins[1:]) / 2 world_plot = world.plot( column='pop_est', ax=ax, legend=True, cmap=cmap, legend_kwds={'ticks': tick_positions} ) # 修改刻度标签为自定义文本 world_plot.get_legend().ax.set_yticklabels(['Low', 'Medium', 'High']) plt.show()
这两种方法都能正确替换图例刻度为自定义文本标签,避免报错。
内容的提问来源于stack exchange,提问作者Stücke
相关产品推荐
相关产品推荐

