Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 *

np.random.seed(10)    
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)
colorbar(mat)
show()

Here are the values of a matrix:

[[ 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 jet 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 jet 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

like image 928
enedene Avatar asked Feb 21 '23 14:02

enedene


1 Answers

You can use ListedColormap:

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

N = 10

np.random.seed(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))
plt.show()

enter image description here

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

like image 130
HYRY Avatar answered Feb 23 '23 20:02

HYRY