enedene enedene - 1 year ago 74
Python Question

Add separate colors for two (or more) specific values in color plot and color bar

I want to show a matrix in color plot and give specific colors to two or more special values.

import numpy as np
from pylab import *

a=np.random.randint(-1,10, size=(5, 5))
print a

fig, ax = plt.subplots()
mat=ax.matshow(a, cmap=cm.jet, vmin=1, vmax=10)

Here are the values of

[[ 8 3 -1 0 8]
[-1 0 9 7 8]
[-1 9 7 5 3]
[ 2 -1 3 5 7]
[ 9 0 7 3 0]]

Here is the plot:
enter image description here

I'd like to assign black color to all -1 entries and white to all 0 entries, and I'd like it to be shown on color bar below number one as two discrete colors. Here is an example, my photo editing skills are poor, but it should be clear what I want (color bar should be in scale):

enter image description here
It's not important to me to have a continuous
color map, I'd be satisfied with a solution where my color bar would be discrete, and consisted of, for example 10 colors, of which two would be black and white, 8 from
color map colors. However, it's important that -1 and 0 have distinct colors, no matter what the total range of values is.

For example if value range was from -1 to 1000:

enter image description here

Answer Source

You can use ListedColormap:

import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt

N = 10

a=np.random.randint(-1, N, size=(5, 5))
print a

fig, ax = plt.subplots()

colors = [(0.0,0.0,0.0),(1.0,1.0,1.0)]
colors.extend(mpl.cm.jet(np.linspace(0, 1, N-1)))
cmap = mpl.colors.ListedColormap(colors)
mat=ax.matshow(a, cmap=cmap, vmin=-1, vmax=N-1)
cax = plt.colorbar(mat, ticks=np.linspace(-0.5, N-1-0.5, N+1))
cax.set_ticklabels(range(-1, N))

enter image description here

for value ranges, you can convert the values to range index first.