是否可以根据值的范围设置颜色栏的下部和/或上部?例如,给定下面的ROYGBIV颜色图以及可选的offset
和range
值,我想更改offset
以下和/或range
以上的颜色。换句话说,假设offset = 20
和range = 72
,我想将所有小于或等于20的值都涂成黑色,并将所有大于或等于72的值涂成白色。我知道方法set_under
和set_over
,但据我所知,它们需要更改参数vmin
和vmax
(据我所知) 。我想保留原始的最小值和最大值(例如vmin = 0
和vmax = 100
),并且仅(可选)更改四肢的颜色。
ROYGBIV = {
"blue": ((0.0, 1.0, 1.0),
(0.167, 1.0, 1.0),
(0.333, 1.0, 1.0),
(0.5, 0.0, 0.0),
(0.667, 0.0, 0.0),
(0.833, 0.0, 0.0),
(1.0, 0.0, 0.0)),
"green": ((0.0, 0.0, 0.0),
(0.167, 0.0, 0.0),
(0.333, 0.0, 0.0),
(0.5, 1.0, 1.0),
(0.667, 1.0, 1.0),
(0.833, 0.498, 0.498),
(1.0, 0.0, 0.0)),
"red": ((0.0, 0.5608, 0.5608),
(0.167, 0.4353, 0.4353),
(0.333, 0.0, 0.0),
(0.5, 0.0, 0.0),
(0.667, 1.0, 1.0),
(0.833, 1.0, 1.0),
(1.0, 1.0, 1.0))
}
rainbow_mod = matplotlib.colors.LinearSegmentedColormap("rainbow_mod", ROYGBIV, 256)
答案 0 :(得分:0)
我发现一种使用ListedColormap
的方法,如here所述。基本思想是获取LinearSegmentedColormap
对象(numpy
数组)中颜色的RGBA列表/元组,并用所需颜色的副本替换前几个或最后几个列表。
它看起来像这样:
under_color = [0.0, 0.0, 0.0, 1.0] # black (alpha = 1.0)
over_color = [1.0, 1.0, 1.0, 1.0] # white (alpha = 1.0)
all_colors = rainbow_mod(np.linspace(0, 1, 256))
vmin = 0.0
vmax = 100.0
all_colors[:int(np.round((20.0 - vmin) / (vmax - vmin) * 256)), :] = under_color
all_colors[int(np.round((72.0 - vmin) / (vmax - vmin) * 256)):, :] = over_color
rainbow_mod_list = matplotlib.colors.ListedColormap(all_colors.tolist())