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

问题描述

我正在根据该点的变量将地球上的点(经纬度坐标)分类我有一个数组(360 x 720)(地球的纬度,经度网格的分辨率),其中包含每个点的适当分类作为数字, 有13个类别; a,b,c,... 在我的 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 个类别):

const generate = async (base,upper,size,numbersWanted) => {

    return new Promise((resolve,reject) => {

        try {

            console.log('Working...');

            let myPool = [];
            let counter = {};

            // Generate the Pool and count each number generated
            for (let x = 0; x < size; x++) {

                let randomnum = getRandomNumber(base,upper);
                myPool.push(randomnum);
                if (counter.hasOwnProperty(randomnum)) counter[randomnum]++;
                else counter[randomnum] = 1;

            }

            // Create an array of the occurred numbers and the amounts
            let sortable = [];
            for (let number in counter) {
                sortable.push([String(number),counter[number]]);
            }

            // Sort the array by highest occurred numbers
            sortable.sort(function(a,b) {
                return b[1] - a[1];
            });

            // Slice of the not needed numbers that didnt occurr as much
            let reduced = sortable.slice(0,numbersWanted);

            let result = {
                pool: myPool,counter: counter,wantedNumbers: reduced
            };

            resolve(result);

        } catch (e) {
            reject(e);
        }


    })
};

现在,您应该在颜色栏上看到总共 13 个刻度。但是,目前 cb.set_ticks([i for i in range(1,14,1)]) 是数字 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'])

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...