#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. ДА. Спасибо за разъяснение. Я хотел спросить, могут ли одни и те же категории землепользования, представленные разными цветами на цветовой панели, быть представлены отдельными легендами или нет?