Home > other >  How to create multiple legends in seaborn/matplotlib?
How to create multiple legends in seaborn/matplotlib?

Time:08-18

I want to create a heatmap in seaborn, and have a nice way to see the labels.

With ax.figure.tight_layout(), I am getting

enter image description here

which is obviously bad.

Without ax.figure.tight_layout(), the labels get cropped.

enter image description here

The code is

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sn

n_classes = 10
confusion = np.random.randint(low=0, high=100, size=(n_classes, n_classes))

label_length = 20

label_ind_by_names = {
    "A"*label_length: 0,
    "B"*label_length: 1,
    "C"*label_length: 2,
    "D"*label_length: 3,
    "E"*label_length: 4,
    "F"*label_length: 5,
    "G"*label_length: 6,
    "H"*label_length: 7,
    "I"*label_length: 8,
    "J"*label_length: 9,
}

# confusion matrix
df_cm = pd.DataFrame(
    confusion,
    index=label_ind_by_names.keys(),
    columns=label_ind_by_names.keys()
)
plt.figure()
sn.set(font_scale=1.2)
ax = sn.heatmap(df_cm, annot=True, annot_kws={"size": 16}, fmt='d')
# ax.figure.tight_layout()


plt.show()

I would like to create an extra legend based on label_ind_by_names, then post an abbreviation on the heatmap itself, and be able to look up the abbreviation in the legend.

How can this be done in seaborn?

CodePudding user response:

You can define your own enter image description here

  • Related