Question

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.

Was it helpful?

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top