Matplotlib: ListedColormap не отображает цвета - PullRequest
0 голосов
/ 16 октября 2018

У меня возникают проблемы с пониманием того, почему пользовательский cmap не отображается должным образом на изображение с помощью plt.imshow.

Когда я строю двумерный массив resr без указания карты, ясм .:

resr = np.array([[0,2],[3,4]],dtype=int)
plt.imshow(resr)

enter image description here

Это выглядит правильно.Когда я пытаюсь передать карту моих указанных цветов, используя:

cmap1 = ['#7fc97f', '#ffff99', '#386cb0', '#f0027f']
cmap = colors.ListedColormap(cmap1) 
plt.imshow(resr, cmap=cmap)

, я вижу:

enter image description here

По какой-то причине,цвет cmap1[3] сопоставляется со значениями resr 3 и 4.Почему это происходит?

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Здесь я вижу два варианта:

A.Сопоставить данные с категориями

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors as colors
from mpl_toolkits.axes_grid1 import make_axes_locatable

resr = np.array([[0,2],[3,4]],dtype=int)
u, ind = np.unique(resr, return_inverse=True)
norm = colors.BoundaryNorm(np.arange(len(u)+1)-.5, len(u))
cmap1 = ['#7fc97f', '#ffff99', '#386cb0', '#f0027f']
cmap = colors.ListedColormap(cmap1) 

fig,ax = plt.subplots()
im = ax.imshow(ind.reshape(resr.shape), cmap=cmap,norm=norm)
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%")

cb = plt.colorbar(im, cmap=cmap,norm=norm,cax=cax)

cb.set_ticks(np.arange(len(u)))
cb.ax.set_yticklabels(cmap1)
cb.ax.tick_params(labelsize=10)

plt.show()

B.Сопоставить категории с данными

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors as colors
from mpl_toolkits.axes_grid1 import make_axes_locatable

resr = np.array([[0,2],[3,4]],dtype=int)

u = np.unique(resr)
bounds = np.concatenate(([resr.min()-1], u[:-1]+np.diff(u)/2. ,[resr.max()+1]))
print(bounds)
norm = colors.BoundaryNorm(bounds, len(bounds)-1)
cmap1 = ['#7fc97f', '#ffff99', '#386cb0', '#f0027f']
cmap = colors.ListedColormap(cmap1) 

fig,ax = plt.subplots()
im = ax.imshow(resr, cmap=cmap,norm=norm)
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%")

cb = plt.colorbar(im, cmap=cmap,norm=norm,cax=cax)

cb.set_ticks(bounds[:-1]+np.diff(bounds)/2.)
cb.ax.set_yticklabels(cmap1)
cb.ax.tick_params(labelsize=10)

plt.show()

Результат одинаков для обоих случаев.

enter image description here

0 голосов
/ 19 октября 2018

После комментария @ ImportanceOfBeingErnest, содержащего ссылку на их сообщение , я смог найти решение.

Хитрость заключалась в том, чтобы использовать проход от np.unique(resr) до BoundaryNorm .Что-то вроде:

resr = np.array([[0,2],[3,4]],dtype=int)

norm = colors.BoundaryNorm(np.unique(resr), len(np.unique(resr))-1)
cmap1 = ['#7fc97f', '#ffff99', '#386cb0', '#f0027f']
cmap = colors.ListedColormap(cmap1) 
plt.imshow(resr, cmap=cmap,norm=norm);plt.colorbar()

, который возвращает ожидаемый результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...