Дискретная цветовая панель Matplotlib для построения графиков различных категорий землепользования

#python #matplotlib #colorbar

Вопрос:

Я попытался определить дискретную цветовую полосу для участков разных категорий земель, используя отдельные цвета для каждой категории. Я попытался использовать следующий код. Я не получаю красный/томатный цвет для первой выбранной категории, т. е. «Городской». Цветовая полоса начинается со сливового цвета. Как я могу это решить?

Мой другой вопрос заключается в том, можем ли мы поставить галочку цветовая полоса в середине дискретного цветового кода на цветовой полосе?

Я не прикрепляю сюда свой набор данных. Если это требуется, можно создать любой случайный массив. Категории землепользования-это ничто иное, как мы представляем различные категории с несколькими указанными номерами(например: 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)
 

Ответ №1:

Таким образом, вы находитесь только на полпути с цветовой картой. Вам нужно определить уровни для ваших контуров, и вам нужно использовать граничную норму. Убрав вашу проекцию из проблемы и просто сделав равные полосы, я сделал уровни контуров ровно на полпути между вашими дискретными значениями. Если вы этого не сделаете, линейная интерполяция между данными приведет к смещению контура в ту или иную сторону.

 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')
 

введите описание изображения здесь

Комментарии:

1. Можно ли представить то же самое с помощью отдельных цветных легенд?

2. Я не понимаю, что ты имеешь в виду. Вы можете добавлять свои собственные метки на цветовую панель. Вы также , вероятно, могли бы придумать легенду, но это потребовало бы некоторых усилий

3. Но это новый вопрос. Я думаю, что приведенный выше вопрос отвечает на ваш первоначальный вопрос.

4. ДА. Спасибо за разъяснение. Я хотел спросить, могут ли одни и те же категории землепользования, представленные разными цветами на цветовой панели, быть представлены отдельными легендами или нет?