簡體   English   中英

使用matplotlib自定義類似Colorbar的圖

[英]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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM