@muser There is no function that returns the corresponding color of a value, val
, in [vmin, vmax], given val
, vmin
, vmax
and a Plotly colorscale, but it is not complicated to devise one, following the following steps:
- given a colorscale, let us say:
pl_scl=[[0.0, 'rgb(0,0,0)'], [0.1, 'rgb(16,41,119)'], [0.2, 'rgb(33,94,123)'], [0.3, 'rgb(49,130,122)'], [0.4, 'rgb(62,145,90)'], [0.5, 'rgb(93,160,75)'], [0.6, 'rgb(141,171,86)'], [0.7, 'rgb(183,181,94)'], [0.8, 'rgb(195,164,110)'], [0.9, 'rgb(225,191,175)'], [1.0, 'rgb(253,250,250)']]
extract the plotly_scale=[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
and the
plotly_colors=['rgb(0,0,0)', 'rgb(16,41,119)', 'rgb(33,94,123)', 'rgb(49,130,122)', 'rgb(62,145,90)', 'rgb(93,160,75)', 'rgb(141,171,86)', 'rgb(183,181,94)', 'rgb(195,164,110)', 'rgb(225,191,175)', 'rgb(253,250,250)']
as follows:
plotly_scale, plotly_colors=map(float, np.array(pl_scl)[:,0]), np.array(pl_scl)[:,1]
- Extract from the list
plotly_colors
the list of tuples, convert it to a numpy.array
and divide that array by 255.0
to get the mpl_colormap=np.array([[ 0. , 0. , 0. ], [ 0.0627451 , 0.16078431, 0.46666667], [ 0.12941176, 0.36862745, 0.48235294], [ 0.19215686, 0.50980392, 0.47843137], [ 0.24313725, 0.56862745, 0.35294118], [ 0.36470588, 0.62745098, 0.29411765], [ 0.55294118, 0.67058824, 0.3372549 ], [ 0.71764706, 0.70980392, 0.36862745], [ 0.76470588, 0.64313725, 0.43137255], [ 0.88235294, 0.74901961, 0.68627451], [ 0.99215686, 0.98039216, 0.98039216]])
For example these two lines of code perform these operations:
from ast import literal_eval
mpl_colormap=np.array(map(literal_eval,[color[3:] for color in plotly_colors] ))/255.0
- define a function
get_color_for_val(val, plotly_scale, mpl_colormap, vmin, vmax)
that returns the
color corresponding to the value val
from the interval [vmin, vmax]
(in your case in vmin=-1, vmax=1).
Namely:
-
normalize val
, i.e. compute v=(val-vmin)/(vmax-vmin)
-
By a sequential search or a binary search find two consecutive indices idx
, idx+1
of elements in plotly_scale
such that v
belongs to the interval [plotly_scale[idx], plotly_scale[idx+1]
;
-
normalize v
: v_normalized=(v-plotly_scale[idx])/(plotly_scale[idx+1]-plotly_scale[idx])
-
get by linear interpolation the the color corresponding to v_normalized
, that belongs to the βintervalβ of colors [mpl_colormap[idx], mpl_colormap[ix+1]]
:
val_color01=mpl_colormap[idx]+v_normalized*(mpl_colormap[idx + 1]-mpl_colormap[idx])
val_color01
is the corresponding rgb color of the initial value val, with r,g,b, in [0,1];
-
convert the val_colors01
to a color with r, g, b in [0,255]; let us call the resulted array of shape (3,) val_colors_0255
;
-
return the string 'rgb(val_colors_0255[0], val_colors_0255[1], val_colors_0255[2])'
; this is the plotly color code corresponding to val