2015-01-12 2 views
1

Я ищу, чтобы сделать Colorbar как сюжет, так как:Пользовательские Colorbar подобный сюжет с Matplotlib

но с управляемым цветом, например, у меня есть следующие х и у массивов:

x = [0,1,2,4,7,8] 
y = [1,2,1,3,4,5] 

Тогда я бы Colorbar, как на картинке выше, но при у = 1, то будет цвет красный, у = 2: зеленый, у = 3: синий, у = 4: черный, и т.д.

Здесь i S кода питона, который я модифицированный из галереи Matplotlib в:

from matplotlib import pyplot 
import matplotlib as mpl 

fig = pyplot.figure(figsize=(8,1)) 
ax2 = fig.add_axes([0.05, 0.25, 0.9, 0.5]) 

cmap = mpl.cm.Accent 
norm = mpl.colors.Normalize(vmin=5, vmax=10) 
bounds = [1, 2, 4, 7, 8] 
norm = mpl.colors.BoundaryNorm(bounds, cmap.N) 
cb2 = mpl.colorbar.ColorbarBase(ax2, cmap=cmap, 
           norm=norm, 
           boundaries=[0]+bounds+[13], 
           ticks=bounds, # optional 
           spacing='proportional', 
           orientation='horizontal') 

ответ

1

После адаптации коды мне удалось получить что-то, как вы описали. В этом случае colormap генерируется с использованием ListedColormap, и я добавил желтый цвет для y = 5. Важно заметить, что при вычислении BoundaryNorm я использую интервалы, содержащие значения, которые вы описали для y.

from matplotlib import pyplot,colors 
import matplotlib as mpl 

fig = pyplot.figure(figsize=(8,1)) 
ax2 = fig.add_axes([0.05, 0.25, 0.9, 0.5]) 

cmap = colors.ListedColormap(['r', 'g', 'b', 'k','y']) 

bounds = [0, 1, 2, 4, 7, 8, 13] 
yVals = [ 1, 2, 1, 3, 4, 5] 

cBounds = [i+0.5 for i in range(6)] 

norm = mpl.colors.BoundaryNorm(cBounds, cmap.N) 
cb2 = mpl.colorbar.ColorbarBase(ax2, cmap=cmap, 
           norm=norm, 
           values=yVals, 
           boundaries=bounds, 
           ticks=bounds[1:-1], # optional 
           spacing='proportional', 
           orientation='horizontal') 

- ред 14 Яны (mrcl) -

В качестве альтернативы, вы можете использовать pcolormesh построить свои палитры и имеет Colorbar как ваша легенда, как например, в приведенном ниже примере.

from pylab import * 

from matplotlib import pyplot,colors 
import matplotlib as mpl 

fig = pyplot.figure(figsize=(8,1.5)) 
ax1 = fig.add_axes([0.05, 0.25, 0.82, 0.5]) 

cmap = colors.ListedColormap(['r', 'g', 'b', 'k','y']) 

xBounds = array([0, 1, 2, 4, 7, 8, 13]) 
yBounds = array([0, 1]) 
Vals = array([[ 1, 2, 1, 3, 4, 5]]) 

cBounds = [i+0.5 for i in arange(amax(Vals)+1)] 

norm = mpl.colors.BoundaryNorm(cBounds, cmap.N) 

c = ax1.pcolormesh(xBounds,yBounds,Vals,cmap=cmap,norm=norm) 

ax1.set_xticks(xBounds[1:-1]) 
ax1.set_yticks([]) 
ax1.set_xlim(xBounds[0],xBounds[-1]) 
ax1.set_ylim(yBounds[0],yBounds[-1]) 


ax2 = fig.add_axes([0.9, 0.25, 0.05, 0.5]) 
colorbar(c,cax=ax2,ticks=arange(amax(Vals))+1) 

enter image description here

Надеется, что это помогает.

Приветствия

+0

Любой шанс добавить легенду? – jprawiharjo

+0

Добавлен модифицированный пример, включающий легенду. – mrcl

0

Ну, я вроде мастерить с другими способами:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.cm as cmx 
import matplotlib.colors as colors 

close('all') 


def ColorPlot(x,y): 
    figure() 
    jet = plt.get_cmap('jet') 
    cNorm = colors.Normalize(vmin=min(y), vmax=max(y)) 
    scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet) 

    if len(x) == len(y): 
     x.insert(0,0) 
     for kk in range(len(x)-1): 
     colorVal = scalarMap.to_rgba(y[kk]) 
     plt.axvspan(x[kk], x[kk+1], facecolor=colorVal,      
         alpha=0.5,label=colorVal) 

    plt.yticks([]) 
    plt.xticks(x) 
    xlim([x[0],x[-1]]) 

    plt.show() 

x = [1,3,5,6,10,12] 
y = [1,3,4,1,4,3] 

ColorPlot(x,y) 
Смежные вопросы