如何在python中使用字符串轴而不是整数来绘制混淆矩阵

时间:2021-11-24 20:30:42

I am following a previous thread on how to plot confusion matrix in Matplotlib. The script is as follows:

我正在关注如何在Matplotlib中绘制混淆矩阵的前一个主题。脚本如下:

from numpy import *
import matplotlib.pyplot as plt
from pylab import *

conf_arr = [[33,2,0,0,0,0,0,0,0,1,3], [3,31,0,0,0,0,0,0,0,0,0], [0,4,41,0,0,0,0,0,0,0,1], [0,1,0,30,0,6,0,0,0,0,1], [0,0,0,0,38,10,0,0,0,0,0], [0,0,0,3,1,39,0,0,0,0,4], [0,2,2,0,4,1,31,0,0,0,2], [0,1,0,0,0,0,0,36,0,2,0], [0,0,0,0,0,0,1,5,37,5,1], [3,0,0,0,0,0,0,0,0,39,0], [0,0,0,0,0,0,0,0,0,0,38] ]

norm_conf = []
for i in conf_arr:
        a = 0
        tmp_arr = []
        a = sum(i,0)
        for j in i:
                tmp_arr.append(float(j)/float(a))
        norm_conf.append(tmp_arr)

plt.clf()
fig = plt.figure()
ax = fig.add_subplot(111)
res = ax.imshow(array(norm_conf), cmap=cm.jet, interpolation='nearest')


for i,j in ((x,y) for x in xrange(len(conf_arr))
            for y in xrange(len(conf_arr[0]))):
    ax.annotate(str(conf_arr[i][j]),xy=(i,j))

cb = fig.colorbar(res)
savefig("confusion_matrix.png", format="png")

I would like to change the axis to show string of letters, say (A, B, C,...) rather than integers (0,1,2,3, ..10). How can one do that. Thanks.

我想改变轴来显示字母串,比如说(A,B,C,...)而不是整数(0,1,2,3,。10)。怎么能这样做呢。谢谢。

musa

3 个解决方案

#1


59  

Here's what I'm guessing you want: 如何在python中使用字符串轴而不是整数来绘制混淆矩阵

这是我猜你想要的:

import numpy as np
import matplotlib.pyplot as plt

conf_arr = [[33,2,0,0,0,0,0,0,0,1,3], 
            [3,31,0,0,0,0,0,0,0,0,0], 
            [0,4,41,0,0,0,0,0,0,0,1], 
            [0,1,0,30,0,6,0,0,0,0,1], 
            [0,0,0,0,38,10,0,0,0,0,0], 
            [0,0,0,3,1,39,0,0,0,0,4], 
            [0,2,2,0,4,1,31,0,0,0,2],
            [0,1,0,0,0,0,0,36,0,2,0], 
            [0,0,0,0,0,0,1,5,37,5,1], 
            [3,0,0,0,0,0,0,0,0,39,0], 
            [0,0,0,0,0,0,0,0,0,0,38]]

norm_conf = []
for i in conf_arr:
    a = 0
    tmp_arr = []
    a = sum(i, 0)
    for j in i:
        tmp_arr.append(float(j)/float(a))
    norm_conf.append(tmp_arr)

fig = plt.figure()
plt.clf()
ax = fig.add_subplot(111)
ax.set_aspect(1)
res = ax.imshow(np.array(norm_conf), cmap=plt.cm.jet, 
                interpolation='nearest')

width, height = conf_arr.shape

for x in xrange(width):
    for y in xrange(height):
        ax.annotate(str(conf_arr[x][y]), xy=(y, x), 
                    horizontalalignment='center',
                    verticalalignment='center')

cb = fig.colorbar(res)
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
plt.xticks(range(width), alphabet[:width])
plt.yticks(range(height), alphabet[:height])
plt.savefig('confusion_matrix.png', format='png')

#2


13  

Just use matplotlib.pyplot.xticks and matplotlib.pyplot.yticks.

只需使用matplotlib.pyplot.xticks和matplotlib.pyplot.yticks。

E.g.

import matplotlib.pyplot as plt
import numpy as np

plt.imshow(np.random.random((5,5)), interpolation='nearest')
plt.xticks(np.arange(0,5), ['A', 'B', 'C', 'D', 'E'])
plt.yticks(np.arange(0,5), ['F', 'G', 'H', 'I', 'J'])

plt.show()

如何在python中使用字符串轴而不是整数来绘制混淆矩阵

#3


2  

Here is what you want:

这是你想要的:

from string import ascii_uppercase
from pandas import DataFrame
import numpy as np
import seaborn as sn
from sklearn.metrics import confusion_matrix

y_test = np.array([1,2,3,4,5, 1,2,3,4,5, 1,2,3,4,5])
predic = np.array([1,2,4,3,5, 1,2,4,3,5, 1,2,3,4,4])

columns = ['class %s' %(i) for i in list(ascii_uppercase)[0:len(np.unique(y_test))]]

confm = confusion_matrix(y_test, predic)
df_cm = DataFrame(confm, index=columns, columns=columns)

ax = sn.heatmap(df_cm, cmap='Oranges', annot=True)

Example image output is here: 如何在python中使用字符串轴而不是整数来绘制混淆矩阵

示例图像输出在这里:


If you want a more complete confusion matrix as the matlab default, with totals (last line and last column), and percents on each cell, see this module below.

如果您想要更完整的混淆矩阵作为matlab默认值,总计(最后一行和最后一列)以及每个单元格的百分比,请参阅下面的此模块。

Because I scoured the internet and didn't find a confusion matrix like this one on python and I developed one with theses improvements and shared on git.

因为我搜索了互联网,并没有在python上找到像这样的混淆矩阵,我开发了一个带有这些改进并在git上共享。


REF:

https://github.com/wcipriano/pretty-print-confusion-matrix

The output example is here: 如何在python中使用字符串轴而不是整数来绘制混淆矩阵

输出示例如下:

#1


59  

Here's what I'm guessing you want: 如何在python中使用字符串轴而不是整数来绘制混淆矩阵

这是我猜你想要的:

import numpy as np
import matplotlib.pyplot as plt

conf_arr = [[33,2,0,0,0,0,0,0,0,1,3], 
            [3,31,0,0,0,0,0,0,0,0,0], 
            [0,4,41,0,0,0,0,0,0,0,1], 
            [0,1,0,30,0,6,0,0,0,0,1], 
            [0,0,0,0,38,10,0,0,0,0,0], 
            [0,0,0,3,1,39,0,0,0,0,4], 
            [0,2,2,0,4,1,31,0,0,0,2],
            [0,1,0,0,0,0,0,36,0,2,0], 
            [0,0,0,0,0,0,1,5,37,5,1], 
            [3,0,0,0,0,0,0,0,0,39,0], 
            [0,0,0,0,0,0,0,0,0,0,38]]

norm_conf = []
for i in conf_arr:
    a = 0
    tmp_arr = []
    a = sum(i, 0)
    for j in i:
        tmp_arr.append(float(j)/float(a))
    norm_conf.append(tmp_arr)

fig = plt.figure()
plt.clf()
ax = fig.add_subplot(111)
ax.set_aspect(1)
res = ax.imshow(np.array(norm_conf), cmap=plt.cm.jet, 
                interpolation='nearest')

width, height = conf_arr.shape

for x in xrange(width):
    for y in xrange(height):
        ax.annotate(str(conf_arr[x][y]), xy=(y, x), 
                    horizontalalignment='center',
                    verticalalignment='center')

cb = fig.colorbar(res)
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
plt.xticks(range(width), alphabet[:width])
plt.yticks(range(height), alphabet[:height])
plt.savefig('confusion_matrix.png', format='png')

#2


13  

Just use matplotlib.pyplot.xticks and matplotlib.pyplot.yticks.

只需使用matplotlib.pyplot.xticks和matplotlib.pyplot.yticks。

E.g.

import matplotlib.pyplot as plt
import numpy as np

plt.imshow(np.random.random((5,5)), interpolation='nearest')
plt.xticks(np.arange(0,5), ['A', 'B', 'C', 'D', 'E'])
plt.yticks(np.arange(0,5), ['F', 'G', 'H', 'I', 'J'])

plt.show()

如何在python中使用字符串轴而不是整数来绘制混淆矩阵

#3


2  

Here is what you want:

这是你想要的:

from string import ascii_uppercase
from pandas import DataFrame
import numpy as np
import seaborn as sn
from sklearn.metrics import confusion_matrix

y_test = np.array([1,2,3,4,5, 1,2,3,4,5, 1,2,3,4,5])
predic = np.array([1,2,4,3,5, 1,2,4,3,5, 1,2,3,4,4])

columns = ['class %s' %(i) for i in list(ascii_uppercase)[0:len(np.unique(y_test))]]

confm = confusion_matrix(y_test, predic)
df_cm = DataFrame(confm, index=columns, columns=columns)

ax = sn.heatmap(df_cm, cmap='Oranges', annot=True)

Example image output is here: 如何在python中使用字符串轴而不是整数来绘制混淆矩阵

示例图像输出在这里:


If you want a more complete confusion matrix as the matlab default, with totals (last line and last column), and percents on each cell, see this module below.

如果您想要更完整的混淆矩阵作为matlab默认值,总计(最后一行和最后一列)以及每个单元格的百分比,请参阅下面的此模块。

Because I scoured the internet and didn't find a confusion matrix like this one on python and I developed one with theses improvements and shared on git.

因为我搜索了互联网,并没有在python上找到像这样的混淆矩阵,我开发了一个带有这些改进并在git上共享。


REF:

https://github.com/wcipriano/pretty-print-confusion-matrix

The output example is here: 如何在python中使用字符串轴而不是整数来绘制混淆矩阵

输出示例如下: