【问题标题】:Matplotlib discrete colorbar for plotting different landuse categoriesMatplotlib 离散颜色条,用于绘制不同的土地利用类别
【发布时间】:2021-10-05 05:21:45
【问题描述】:

我尝试定义一个离散的颜色条来为每个类别使用不同的颜色来绘制不同的土地类别。我尝试使用以下代码。我没有得到第一个选择的类别的红色/番茄颜色,即“城市”。彩条以李子色开始。我该如何解决?

我的另一个问题是我们可以将颜色条刻度线放在颜色条上离散颜色代码的中间吗?

我没有在此处附加我的数据集。如果需要,可以创建任何随机数组。土地利用类别只不过是我们用很少的特定数字表示不同的类别(例如:1 代表城市,13 代表森林,9 代表雪等)

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import matplotlib.colors
from matplotlib.colors import ListedColormap
import numpy as np

col_dict = {
    1:"tomato",
    2:"plum",
    7:"lightgreen",
    11:"green",
    15:"maroon",
    16:"aqua",
    17:"navy",
    19:"goldenrod",
    22:"white",
}
labels = np.array([
    "Urban",
    "I Cropland",
    "Grassland",
    "B Deciduous",
    "Mixed Forest",
    "Water Bodies",
    "H Wetland", 
    "Barren",
    "Tundra",
])
crs = ccrs.PlateCarree()
ax = plt.subplot(111, projection=crs)
cm = ListedColormap([col_dict[x] for x in col_dict.keys()])
conf = ax.contourf(lonn, latt, lu_index, cmap=cm)

【问题讨论】:

    标签: python matplotlib colorbar


    【解决方案1】:

    因此,您只是使用颜色图的一部分。您需要为轮廓定义级别,并且需要使用 BoundaryNorm。将您的投影排除在问题之外并制作相等的条纹,我已经使轮廓水平正好在您的离散值之间的一半。如果你不这样做,数据之间的线性插值会将轮廓朝向一侧或另一侧。

    import matplotlib.pyplot as plt
    import matplotlib.colors as mcolors
    from matplotlib.colors import ListedColormap
    import numpy as np
    
    col_dict = {
        1:"tomato",
        2:"plum",
        7:"lightgreen",
        11:"green",
        15:"maroon",
        16:"aqua",
        17:"navy",
        19:"goldenrod",
        22:"white",
    }
    labels = np.array([
        "Urban",
        "I Cropland",
        "Grassland",
        "B Deciduous",
        "Mixed Forest",
        "Water Bodies",
        "H Wetland", 
        "Barren",
        "Tundra",
    ])
    cm = ListedColormap([col_dict[x] for x in col_dict.keys()])
    np.random.seed(2112)
    lu_index = np.zeros((9, 9))
    for nn,k in enumerate(col_dict.keys()):
        lu_index[nn, :] = k
    
    bounds = np.array([k for k in col_dict.keys()])
    bounds = bounds[:-1] + np.diff(bounds) / 2
    bounds = np.concatenate((np.array([0]), bounds, np.array([24])))
    norm = mcolors.BoundaryNorm(bounds, 9)
    
    fig, axs = plt.subplots(1, 3, constrained_layout=True, figsize=(6, 4))
    ax = axs[0]
    conf = ax.contourf(lu_index, cmap=cm)
    ax.set_title('No Boundary Norm, \nno levels')
    
    ax = axs[1]
    conf = ax.contourf(lu_index, cmap=cm, levels=bounds)
    ax.set_title('No Boundary Norm, \nlevels')
    
    ax = axs[2]
    conf = ax.contourf(lu_index, cmap=cm, norm=norm, levels=bounds)
    ax.set_title('Boundary Norm, \nlevels')
    

    【讨论】:

    • 是否可以用单独的颜色图例表示相同的?
    • 我不明白你的意思。您可以将自己的标签添加到颜色条。你也可以编造一个传奇,但这需要一些努力
    • 但这是一个新问题。我认为上面的问题回答了你原来的问题。
    • 是的。感谢您的澄清。我想问在颜色栏中用不同颜色表示的相同土地利用类别是否可以用单独的图例表示?
    猜你喜欢
    • 2016-10-10
    • 2015-12-26
    • 1970-01-01
    • 2021-07-28
    • 2020-12-22
    • 1970-01-01
    • 2014-12-20
    • 2021-06-16
    • 1970-01-01
    相关资源
    最近更新 更多