Search code examples
pythonmatplotlibcolor-mapping

matplotlib colormap: do not resize


I am drawing a confusion matrix using matplotlib:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

conf_arr_hs = [[90, 74],
                [33, 131]]
norm_conf_hs = []
for i in conf_arr_hs:
    a = 0
    tmp_arr = []
    a = sum(i, 0)
    for j in i:
        tmp_arr.append(float(j)/float(a))
    norm_conf_hs.append(tmp_arr)


confmatmap=cm.binary    
fig = plt.figure()


plt.clf()
ax = fig.add_subplot(111)
res = ax.imshow(np.array(norm_conf_hs), cmap=confmatmap, interpolation='nearest')
for x in xrange(2):
    for y in xrange(2):
        textcolor = 'black'
        if norm_conf_hs[x][y] > 0.5:
            textcolor = 'white'
        ax.annotate("%0.2f"%norm_conf_hs[x][y], xy=(y, x),  horizontalalignment='center', verticalalignment='center', color=textcolor)]

But matplotlib seems to auto-resize the color change range: the bottom left grid should be light gray since its corresponding value is 0.2 instead of 0.0. Similarly, bottom right grid should be dark gray since it is 0.8 instead of 1.

I think I miss the step of appointing the dynamic range for color mapping. I did some research into the documentation of matplotlib but did not find what I want.


Solution

  • To explicitly set the color map range, you want to use the set_clim command:

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.gridspec as gridspec
    
    plt.ion()
    
    conf_arr_hs = [[90, 74],
                    [33, 131]]
    norm_conf_hs = []
    for i in conf_arr_hs:
        a = 0
        tmp_arr = []
        a = sum(i, 0)
        for j in i:
            tmp_arr.append(float(j)/float(a))
        norm_conf_hs.append(tmp_arr)
    
    confmatmap=plt.cm.binary    
    fig = plt.figure()
    
    plt.clf()
    ax = fig.add_subplot(111)
    res = ax.imshow(np.array(norm_conf_hs), cmap=confmatmap, interpolation='nearest')
    res.set_clim(0,1) # set the limits for your color map
    
    for x in xrange(2):
        for y in xrange(2):
            textcolor = 'black'
            if norm_conf_hs[x][y] > 0.5:
                textcolor = 'white'
            ax.annotate("%0.2f"%norm_conf_hs[x][y], xy=(y, x),  horizontalalignment='center', verticalalignment='center', color=textcolor)
    

    enter image description here

    check more our here: http://matplotlib.org/api/cm_api.html