根据值的范围更改颜色图中的颜色

问题描述 投票:0回答:1

是否可以根据值的范围设置颜色栏的下部和/或上部?例如,给定下面的ROYGBIV颜色图以及offsetrange值(可选),我想更改offset以下和/或range以上的颜色。换句话说,假设offset = 20range = 72,我想将所有小于或等于20的值都涂成黑色,并将所有大于或等于72的值涂成白色。我知道方法set_underset_over,但是它们需要更改参数vminvmax(据我所知),这不是我想要的。我想保留原始的最小值和最大值(例如vmin = 0vmax = 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)

Original colorbar

python-3.x matplotlib colorbar
1个回答
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())

Modified colorbar

© www.soinside.com 2019 - 2024. All rights reserved.