Map values to colors in matplotlib

前端 未结 2 1773
臣服心动
臣服心动 2020-12-14 18:08

I have a list of numbers as follows:

lst = [1.9378076554115014, 1.2084586588892861, 1.2133096565896173, 
       1.2427632053442292, 1.1809971732733273, 0.919         


        
2条回答
  •  星月不相逢
    2020-12-14 18:31

    The matplotlib.colors module is what you are looking for. This provides a number of classes to map from values to colourmap values.

    import matplotlib
    import matplotlib.cm as cm
    
    lst = [1.9378076554115014, 1.2084586588892861, 1.2133096565896173, 1.2427632053442292, 
           1.1809971732733273, 0.91960143581348919, 1.1106310149587162, 1.1106310149587162, 
           1.1527004351293346, 0.87318084435885079, 1.1666132876686799, 1.1666132876686799]
    
    minima = min(lst)
    maxima = max(lst)
    
    norm = matplotlib.colors.Normalize(vmin=minima, vmax=maxima, clip=True)
    mapper = cm.ScalarMappable(norm=norm, cmap=cm.Greys_r)
    
    for v in lst:
        print(mapper.to_rgba(v))
    

    The general approach is find the minima and maxima in your data. Use these to create a Normalize instance (other normalisation classes are available, e.g. log scale). Next you create a ScalarMappable using the Normalize instance and your chosen colormap. You can then use mapper.to_rgba(v) to map from an input value v, via your normalised scale, to a target color.

    for v in sorted(lst):
        print("%.4f: %.4f" % (v, mapper.to_rgba(v)[0]) )
    

    Produces the output:

    0.8732: 0.0000
    0.9196: 0.0501
    1.1106: 0.2842
    1.1106: 0.2842
    1.1527: 0.3348
    1.1666: 0.3469
    1.1666: 0.3469
    1.1810: 0.3632
    1.2085: 0.3875
    1.2133: 0.3916
    1.2428: 0.4200
    1.9378: 1.0000
    

    The matplotlib.colors module documentation has more information if needed.

提交回复
热议问题