使用 matplotlib 自定义 Colorbar-like 绘图

Custom Colorbar-like plot with matplotlib

我正在寻找像情节这样的颜色条:

但颜色可控,例如我有以下 x 和 y 数组:

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

然后我会有一个像上图这样的颜色条,但是当y=1时,它会变成红色,y=2:绿色,y=3:蓝色,y=4:黑色,等等

这是我从 matplotlib 的库中修改的 python 代码:

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')

在调整你的代码后,我设法获得了你描述的东西。 在这种情况下,颜色图是使用 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')

-- 1 月 14 日编辑 (mrcl) --

或者,您可以使用 pcolormesh 绘制颜色图并使用颜色条作为图例,如下例所示。

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)

希望对您有所帮助。

干杯

好吧,我有点修补其他方法:

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)