设置matplotlib colormap的颜色限制。

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

我做了一个函数来获取一组数据的十六进制代码,具体如下。

from matplotlib import cm, colors
def get_color(series_data, cmap='Reds'):
    color_map = cm.get_cmap(cmap, 20)
    f = lambda x: colors.rgb2hex(color_map(x/series_data.max())[:3])
    return series_data.apply(f)

这个 cm.get_cmap(cmap, 20) 生成一个matplotlib.color.LinearSegmentedColormap对象,该对象的范围为输入的最小值。series_data 到其最大值。

我不知道如何定义要评估的数据的颜色限制。例如,如果我想设置恒定的颜色限制,将最小值定义为0,最大值定义为100,该怎么办?我如何在我的函数中做到这一点?

我试着用以下方法来代替 series_data.max()100 来控制最大等效颜色(max),但我无法控制cmin。

matplotlib color-mapping
1个回答
1
投票

的参数 color_map 需要缩放到[0.,1.]范围。例如,如果需要获得的最小(最大)颜色值为 lo (hi)值。

from matplotlib import cm, colors
import pandas as pd

def get_color(series_data, cmap='Reds', lo=None, hi=None):
    if lo is None:
        lo = series_data.min()
    if hi is None:
        hi = series_data.max()
    if lo == hi:
        raise Exception('Invalid range.')
    color_map = cm.get_cmap(cmap, 20)
    f = lambda x: colors.rgb2hex(color_map((x-lo)/(hi-lo))[:3])
    return series_data.apply(f)

s = pd.Series(np.linspace(0,3,16))
colz = get_color(s, lo=1, hi=2)
for x, c in zip(s, colz):
    print('{:.2f} {}'.format(x,c))

样本输出是

0.00 #fff5f0
0.20 #fff5f0
0.40 #fff5f0
0.60 #fff5f0
0.80 #fff5f0
1.00 #fff5f0
1.20 #fdc7b0
1.40 #fc8363
1.60 #ed392b
1.80 #af1117
2.00 #67000d
2.20 #67000d
2.40 #67000d
2.60 #67000d
2.80 #67000d
3.00 #67000d
© www.soinside.com 2019 - 2024. All rights reserved.