如何在 python 中为 cartopy 和 Matplotlib 图创建图例?

How can I create a legend for a cartopy and Matplotlib plot in python?

我正在根据该点的变量对地球上的点(经度和纬度坐标)进行分类。 我有一个数组 (360 x 720)(我的地球经纬度网格的分辨率),其中包含每个点的适当分类作为数字, 有13个类别;一个,乙,丙,... 在我的 360x 720 数组中,这些类别表示为 1、2、3、...、13。

我可以通过 cartopy 和 matplotlib 对其进行映射,但我一直在尝试制作一个图例/键来显示每个颜色映射代表的类别,我能得到的最好的是一个无用的颜色条。

 ax = plt.axes(projection=ccrs.PlateCarree()) #cartopy

preplot = plt.contourf(lons, lats, Map, 17,
             transform=ccrs.PlateCarree(), cmap = "tab20")
ax.coastlines() # cartopy
cb = plt.colorbar(preplot, orientation="horizontal")

plt.title("1901")

plt.show()

给出: enter image description here 地图和颜色条

抱歉,如果这不是所有需要的信息

如果我对你的问题的理解正确,你想将所有 13 个类别的标签添加到你的颜色栏吗?在这种情况下,您应该使用以下方法在颜色栏上设置总共 13 个刻度(因为您有 13 个类别):

cb.set_ticks([i for i in range(1, 14, 1)])

现在,您应该会在颜色栏上看到总共 13 个刻度。但是,目前 ticklabels 是数字 1-13。要更改此设置,您可以使用 cb.set_ticklabels(<list_of_strings>)。所以,例如:

cb.set_ticklabels(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'])

在这种情况下,您的完整代码将是:

ax = plt.axes(projection=ccrs.PlateCarree()) #cartopy

preplot = plt.contourf(lons, lats, Map, 17,
             transform=ccrs.PlateCarree(), cmap = "tab20")
ax.coastlines() # cartopy
cb = plt.colorbar(preplot, orientation="horizontal")

# Update the colorbar ticks + labels
cb.set_ticks([i for i in range(1, 14, 1)])
cb.set_ticklabels(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'])

plt.title("1901")

plt.show()