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

如何为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'

错误原因分析

  1. 第一种错误是因为ticks参数需要传入数值型刻度值,而非直接传入文本标签,Geopandas的图例需要先基于数据分箱的数值范围设置刻度位置,再替换为文本标签。
  2. 第二种错误是因为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:17:20