Определение дискретной карты цветов для imshow в matplotlib
У меня есть простое изображение, которое я показываю с imshow в matplotlib. Я хотел бы применить пользовательскую цветовую карту, чтобы значения от 0 до 5 были белыми, от 5 до 10 - красными (очень простые цвета) и т. Д. Я пробовал следовать этому уроку:
http://assorted-experience.blogspot.com/2007/07/custom-colormaps.html со следующим кодом:
cdict = {
'red' : ((0., 0., 0.), (0.5, 0.25, 0.25), (1., 1., 1.)),
'green': ((0., 1., 1.), (0.7, 0.0, 0.5), (1., 1., 1.)),
'blue' : ((0., 1., 1.), (0.5, 0.0, 0.0), (1., 1., 1.))
}
my_cmap = mpl.colors.LinearSegmentedColormap('my_colormap', cdict, 3)
plt.imshow(num_stars, extent=(min(x), max(x), min(y), max(y)), cmap=my_cmap)
plt.show()
Но в итоге получаются странные цвета, и мне нужно только 3-4 цвета, которые я хочу определить. Как мне это сделать?
2 ответа
Вы можете использовать ListedColormap
чтобы указать белый и красный цвета как единственные цвета в цветовой карте, а границы определяют, где происходит переход от одного цвета к следующему:
import matplotlib.pyplot as plt
from matplotlib import colors
import numpy as np
np.random.seed(101)
zvals = np.random.rand(100, 100) * 10
# make a color map of fixed colors
cmap = colors.ListedColormap(['white', 'red'])
bounds=[0,5,10]
norm = colors.BoundaryNorm(bounds, cmap.N)
# tell imshow about color map so that only set colors are used
img = plt.imshow(zvals, interpolation='nearest', origin='lower',
cmap=cmap, norm=norm)
# make a color bar
plt.colorbar(img, cmap=cmap, norm=norm, boundaries=bounds, ticks=[0, 5, 10])
plt.savefig('redwhite.png')
plt.show()
Полученная фигура имеет только два цвета:
Я предложил по существу то же самое для несколько иного вопроса: визуализация данных 2D-сетки в Python
Решение вдохновлено примером matplotlib. В примере объясняется, что bounds
должно быть на один больше, чем количество используемых цветов.
BoundaryNorm
является нормализацией, которая отображает ряд значений в целые числа, которые затем используются для назначения соответствующих цветов. cmap.N
в приведенном выше примере просто определяет количество цветов.
Почему LinearSegmentedColormap
показывает странный цвет, я думаю, что эта ссылка будет полезна.
http://matplotlib.org/examples/pylab_examples/custom_cmap.html