【问题标题】:Set color limits for matplotlib colormap为 matplotlib 颜色图设置颜色限制
【发布时间】:2020-04-20 17:22:18
【问题描述】:

我做了一个函数来获取一组数据的十六进制代码,如下所示:

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.colors.LinearSegmentedColormap 对象,范围从输入 series_data 的最小值到最大值。

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

我尝试将series_data.max() 替换为100 来控制最大等效颜色(max),但我无法控制cmin。

【问题讨论】:

    标签: matplotlib color-mapping


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 2020-09-25
      • 2021-08-09
      相关资源
      最近更新 更多