strange behaviour or bad coding? color indices in colorbar and data doesnt match.

Hi.

i wanted to make a colorbar for a dataset. dataset has 50 different values.

so instead of entering a different color for 50 values one by one, i tried the code below.

here is what happens:

1- two different data value is painted same color.

changing the color number to some value, sometimes works, sometimes doesnt.

for example, if i change the N (number of colors) in the code below, from 50 to 52,

problem continues, but with different indices. (29-30) are same instead of (28-29).

but if i change it to 60 colors, problem “seems to” go away for given data values in the example.

2- colors in image are not “exactly” taken from colorbar. they are different a tiny bit.

if you check that darkblue color color picker, there is no such color in colorbar!

second ‘data’ line (RGB 21-1-167)

the most close one is color index 28 (RGB 22-2-168)

and even correctly indexed data colors are off a little bit (RGB-values, i mean).

PS: since colors are very similar and look same, you need to use

a RGB color picker/finder app. (i use Color Selector 1.0)

thanks in advance.

===========================================================================

from matplotlib import colors, colorbar, pyplot
import numpy as np

make a dict for colors.

color_info = {}

color_info[“red”] = [[0.0, 0.00, 0.00], # black
[0.2, 0.40, 0.40], # brown
[0.4, 0.60, 0.60], # purple

                 [0.6, 0.00, 0.00],  # darkblue
                 [0.7, 0.00, 0.00],  # green
                 [0.8, 1.00, 1.00],  # yellow
                 [0.9, 1.00, 1.00],  # red
                 [1.0, 1.00, 1.00]]  # white

color_info[“green”] = [[0.0, 0.00, 0.00],
[0.2, 0.20, 0.20],
[0.4, 0.05, 0.05],
[0.6, 0.00, 0.00],

                   [0.7, 1.00, 1.00],
                   [0.8, 1.00, 1.00],
                   [0.9, 0.00, 0.00],
                   [1.0, 1.00, 1.00]]

color_info[“blue”] = [[0.0, 0.00, 0.00],

                  [0.2, 0.00, 0.00],
                  [0.4, 0.70, 0.70],
                  [0.6, 0.65, 0.65],
                  [0.7, 0.00, 0.00],
                  [0.8, 0.00, 0.00],
                  [0.9, 0.18, 0.18],

                  [1.0, 1.00, 1.00]]

divide colorbar into 50 colors. you can change this (Ex: N=15 and use data2)

my_cmap = colors.LinearSegmentedColormap(‘my_colormap’, color_info, N=50)

N = my_cmap.N

we put tickmarks into the middle of colors, by shifting half a segment.

ticklabels = np.arange(N)
ind = np.arange(N)

ticks = [(i / float(N)) + (1 / float(2 * N)) for i in ind]

def my_cbar(cbar_ax, cmap=my_cmap):
“”“adds cbar to image.”""
base = colorbar.ColorbarBase(cbar_ax, cmap=my_cmap,

                             ticks=ticks,
                             orientation="horizontal")

xlabels = cbar_ax.get_xticklabels()
for label in xlabels:

    label.set_rotation(60)

base.set_ticklabels(ticklabels)

labels are very close so dont forget to maximize plot window to see better.

fig = pyplot.figure(figsize=(7, 7))

data = [[27, 28],
[28, 29], # both are same colors!
[29, 30],
[30, 31],
[31, 32],
[32, 33]]

data2 is just to show it works as expected for N=15.

data2 = [[7.999, 8],
[8.999, 9],
[9.999, 10],
[10, 11],

     [11, 12],
     [12, 13]]

with these vmin/vmax, data value 0-0.99999 goes to ‘color index 0’,

data value X - X.9999 goes to ‘color index X’ …etc

(change ‘data’ to ‘data2’ when N=15)

pyplot.imshow(data, cmap=my_cmap,
vmin=0, vmax=N, interpolation=“nearest”)

cx = fig.add_axes((0.2, 0.05, 0.6, 0.03))
my_cbar(cx, cmap=my_cmap)

but data values 28 and 29 goes to same color. maybe this happens for other

data values as well ???

similarly interesting, if you check that darkblue color with a

rgb color picker/reader, there is no such color in colorbar! the most close

one is color index 28.

RGB values ->>> ‘data[1, :]=(21, 1, 167)’ vs ‘color index 28=(22, 2, 168)’

and even correctly indexed colors RGB values are off a little bit.

pyplot.show()

···


Yasin Selçuk Berber
“Bismillah, her hayrın başıdır.”