Search code examples
pythonmatplotlibdata-visualizationsubplotconfusion-matrix

How to show all the labels in subplot. I have 12 labels of which I have to plot a confusion matrix. But only 6 of them are visible


I want to plot a confusion matrix of 12 data, So I made 12 labels to plot the confusion matrix, the plot is coming correctly with the 12 data but x labels and y labels are only half-shown.

I used this snippet--:

import matplotlib.pyplot as plt

labels = ['1','2','3','4','5','6','7','8','9','10','11','12']
cm = confusion_matrix(actualList, predictList, labels)
print(cm)
fig = plt.figure()
fig.set_figheight(10)
fig.set_figwidth(10)
ax = fig.add_subplot()
cax = ax.matshow(cm)
plt.title('Confusion matrix of the classifier',pad=-570)
fig.colorbar(cax)
ax.set_xticklabels([''] + labels)
ax.set_yticklabels([''] + labels)
plt.setp(ax.get_xticklabels(), rotation=30, ha="left",
         rotation_mode="anchor")
plt.xlabel('Predicted')
plt.ylabel('True')
plt.show()

and got this output:

enter image description here


Solution

  • When you have more than a few categories, matplotlib will label the axes incorrectly. To fix this problem, you can import MultipleLocator from matplotlib.ticker to force every cell to be labelled.

    import matplotlib.pyplot as plt
    from matplotlib.ticker import MultipleLocator;
    
    # the same values in your confusion matrix
    labels = ['1','2','3','4','5','6','7','8','9','10','11','12']
    cm = [[0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 1099, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 131, 23, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 40, 0, 0, 3, 0, 0, 0, 0, 0, 0],
        [0, 0, 43, 0, 0, 0, 31, 0, 0, 0, 0, 0],
        [0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 269, 0, 0, 0, 0, 0, 86, 0, 0, 6],
        [0, 0, 101, 0, 0, 0, 0, 0, 0, 45, 0, 1],
        [0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 283, 0, 0, 0, 0, 0, 0, 0, 0, 204]]
    
    fig = plt.figure()
    fig.set_figheight(10)
    fig.set_figwidth(10)
    ax = fig.add_subplot()
    cax = ax.matshow(cm)
    plt.title('Confusion matrix of the classifier',pad=-570)
    fig.colorbar(cax)
    
    ax.xaxis.set_major_locator(MultipleLocator(1))
    ax.yaxis.set_major_locator(MultipleLocator(1))
    
    ax.set_xticklabels([''] + labels)
    ax.set_yticklabels([''] + labels)
    plt.setp(ax.get_xticklabels(), rotation=30, ha="left",
             rotation_mode="anchor")
    plt.xlabel('Predicted')
    plt.ylabel('True')
    plt.show()
    

    enter image description here