Добавить легенду о целых числах вместо градиента в matplotlib - PullRequest
1 голос
/ 26 марта 2020

Я бы хотел добавить легенду, состоящую только из целых чисел, т.е. 0,1,2,3 ... 14, вместо градиентной цветной полосы. По сути, я хочу, чтобы значения массива имели уникальный цвет и метку в легенде, чтобы вы могли четко различать guish каждое значение в массиве.

array plot of land area

fileloc=os.path.join(basepath, infile)
data=np.loadtxt(fileloc)

fig = plt.figure(figsize=(20,10))
plt.imshow(data)
plt.colorbar()

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Если я правильно понял вопрос, данные представлены в виде целочисленного numpy массива, который приводит к изображению с ровно N разных цветов.

Чтобы получить цветовую карту с ровно N цветов из цветовой карты viridis , используйте plt.cm.get_cmap('viridis', N). В результате получится цветная полоса с ровно N областями.

Чтобы красиво поставить галочки в центре каждой области, разделите пространство на 2N + 1 кусочки, а затем займите все нечетные позиции. (Таким образом, если есть 5 цветов, цветовая полоса будет go от 0 до 4, что даст 11 отметок, из которых отметка 0 пропускается и используются отметки 1, 3, 5, 7 и 9). Рядом с каждым галочкой может быть размещена метка с номером.

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(6, 4))

# create some random test data
data = np.random.normal(0, 0.05, size=(150, 150)).cumsum(axis=0).cumsum(axis=1)
data = data.astype(np.int)  # convert to integers
data -= data.min()  # let the numbers start at zero

num_colors = data.max() + 1
cmap = plt.cm.get_cmap('viridis', num_colors)
plt.imshow(data, cmap=cmap)
cbar = plt.colorbar(ticks=np.linspace(0, num_colors - 1, num_colors * 2 + 1)[1::2])
cbar.ax.set_yticklabels(range(num_colors))

plt.show()

resulting plot

0 голосов
/ 26 марта 2020

Вы можете использовать matplotlib.colors.ListedColormap следующим образом:

custom_cmap = colors.ListedColormap(['purple','blue','green','yellow']) #... and so on until you have 15 colours specified

Затем просто передайте это как аргумент cmap в imshow и colorbar:

plt.imshow(data, cmap=custom_cmap)
plt.colorbar(cmap=custom_cmap)
...