Matplotlib дискретный цветовой бар

Я пытаюсь создать дискретную цветовую шкалу для диаграммы рассеяния в matplotlib

У меня есть данные x, y и для каждой точки целочисленное значение тега, которое я хочу представить уникальным цветом, например.

plt.scatter(x, y, c=tag)

обычно тег будет целым числом в диапазоне от 0 до 20, но точный диапазон может измениться

До сих пор я только что использовал настройки по умолчанию, например.

plt.colorbar()

, который дает непрерывный диапазон цветов. В идеале я хотел бы набор из n отдельных цветов (в этом примере n = 20). Еще лучше было бы получить значение тега 0, чтобы получить серый цвет, а 1-20 - красочным.

Я нашел несколько сценариев «поваренной книги», но они очень сложные, и я не могу думать, что они являются правильным способом решения кажущейся простой проблемы

65 голосов | спросил bph 8 FebruaryEurope/MoscowbFri, 08 Feb 2013 20:29:47 +0400000000pmFri, 08 Feb 2013 20:29:47 +040013 2013, 20:29:47

5 ответов


0

Вы можете легко создать собственную дискретную цветовую панель, используя BoundaryNorm в качестве нормализатора для рассеяния. Причудливый бит (в моем методе) делает отображение 0 серым.

Для изображений я часто использую cmap.set_bad () и преобразую свои данные в массив с масками. Это было бы намного проще сделать 0 серым, но я не мог заставить это работать с разбросом или пользовательским cmap.

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

# setup the plot
fig, ax = plt.subplots(1,1, figsize=(6,6))

# define the data
x = np.random.rand(20)
y = np.random.rand(20)
tag = np.random.randint(0,20,20)
tag[10:12] = 0 # make sure there are some 0 values to showup as grey

# define the colormap
cmap = plt.cm.jet
# extract all colors from the .jet map
cmaplist = [cmap(i) for i in range(cmap.N)]
# force the first color entry to be grey
cmaplist[0] = (.5,.5,.5,1.0)
# create the new map
cmap = cmap.from_list('Custom cmap', cmaplist, cmap.N)

# define the bins and normalize
bounds = np.linspace(0,20,21)
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)

# make the scatter
scat = ax.scatter(x,y,c=tag,s=np.random.randint(100,500,20),cmap=cmap, norm=norm)

# create a second axes for the colorbar
ax2 = fig.add_axes([0.95, 0.1, 0.03, 0.8])
cb = mpl.colorbar.ColorbarBase(ax2, cmap=cmap, norm=norm, spacing='proportional', ticks=bounds, boundaries=bounds, format='%1i')

ax.set_title('Well defined discrete colors')
ax2.set_ylabel('Very custom cbar [-]', size=12)

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

Лично я считаю, что с 20 различными цветами немного сложно прочитать конкретное значение, но это, конечно, зависит от вас.

ответил Rutger Kassies 8 FebruaryEurope/MoscowbFri, 08 Feb 2013 22:57:42 +0400000000pmFri, 08 Feb 2013 22:57:42 +040013 2013, 22:57:42
0

Вы можете следовать этому примеру :

#!/usr/bin/env python
"""
Use a pcolor or imshow with a custom colormap to make a contour plot.

Since this example was initially written, a proper contour routine was
added to matplotlib - see contour_demo.py and
http://matplotlib.sf.net/matplotlib.pylab.html#-contour.
"""

from pylab import *


delta = 0.01
x = arange(-3.0, 3.0, delta)
y = arange(-3.0, 3.0, delta)
X,Y = meshgrid(x, y)
Z1 = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = Z2 - Z1 # difference of Gaussians

cmap = cm.get_cmap('PiYG', 11)    # 11 discrete colors

im = imshow(Z, cmap=cmap, interpolation='bilinear',
            vmax=abs(Z).max(), vmin=-abs(Z).max())
axis('off')
colorbar()

show()

который создает следующее изображение:

плохой человек_контур

ответил David Zwicker 8 FebruaryEurope/MoscowbFri, 08 Feb 2013 20:47:41 +0400000000pmFri, 08 Feb 2013 20:47:41 +040013 2013, 20:47:41
0

Чтобы установить значения выше или ниже диапазона цветовой карты, вам нужно использовать set_over и set_under методы цветовой карты. Если вы хотите пометить конкретное значение, замаскируйте его (т.е. создайте маскированный массив) и используйте метод set_bad. (Ознакомьтесь с документацией для базового класса цветовой карты: http: //matplotlib. org /api /colors_api.html # matplotlib.colors.Colormap )

Похоже, вы хотите что-то вроде этого:

import matplotlib.pyplot as plt
import numpy as np

# Generate some data
x, y, z = np.random.random((3, 30))
z = z * 20 + 0.1

# Set some values in z to 0...
z[:5] = 0

cmap = plt.get_cmap('jet', 20)
cmap.set_under('gray')

fig, ax = plt.subplots()
cax = ax.scatter(x, y, c=z, s=100, cmap=cmap, vmin=0.1, vmax=z.max())
fig.colorbar(cax, extend='min')

plt.show()

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

ответил Joe Kington 8 FebruaryEurope/MoscowbFri, 08 Feb 2013 23:38:21 +0400000000pmFri, 08 Feb 2013 23:38:21 +040013 2013, 23:38:21
0

Приведенные выше ответы хороши, за исключением того, что они не имеют правильного расположения галочек на цветовой панели. Мне нравится иметь галочки в середине цвета, чтобы число -> цветное картирование более четкое. Вы можете решить эту проблему, изменив пределы вызова matshow:

import matplotlib.pyplot as plt
import numpy as np

def discrete_matshow(data):
    #get discrete colormap
    cmap = plt.get_cmap('RdBu', np.max(data)-np.min(data)+1)
    # set limits .5 outside true range
    mat = plt.matshow(data,cmap=cmap,vmin = np.min(data)-.5, vmax = np.max(data)+.5)
    #tell the colorbar to tick at integers
    cax = plt.colorbar(mat, ticks=np.arange(np.min(data),np.max(data)+1))

#generate data
a=np.random.randint(1, 9, size=(10, 10))
discrete_matshow(a)

пример дискретной цветовой шкалы

ответил ben.dichter 26 FebruaryEurope/MoscowbThu, 26 Feb 2015 01:04:23 +0300000000amThu, 26 Feb 2015 01:04:23 +030015 2015, 01:04:23
0

Думаю, вы захотите взглянуть на colors.ListedColormap чтобы создать свою цветовую карту, или если вам просто нужна статическая цветовая карта, над которой я работал в приложении , которое может помощь.

ответил ChrisC 8 FebruaryEurope/MoscowbFri, 08 Feb 2013 20:50:36 +0400000000pmFri, 08 Feb 2013 20:50:36 +040013 2013, 20:50:36

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132