O.rka O.rka - 17 days ago 6
Python Question

How to use `annot` method of `sns.heatmap` to give custom labels, in Python and Seaborn?

How can I use the

annot
method of
sns.heatmap
to give it a custom naming scheme?

Essentially, I want to drop all the labels that are lower than my threshold (0 in this case). I tried doing what @ojy said in Custom Annotation Seaborn Heatmap but I'm getting the following error. I saw an example where somebody iterated through every cell, is that the only way to do it?

Seaborn documentation:
annot : bool or rectangular dataset, optional
If True, write the data value in each cell. If an array-like with the same shape as data, then use this to annotate the heatmap instead of the raw data.


So I tried the following:

# Load Datasets
from sklearn.datasets import load_iris
iris = load_iris()
DF_X = pd.DataFrame(iris.data, index = ["%d_%d"%(i,c) for i,c in zip(range(X.shape[0]), iris.target)], columns=iris.feature_names)

# Correlation
DF_corr = DF_X.corr()

# Figure
fig, ax= plt.subplots(ncols=2, figsize=(16,6))
sns.heatmap(DF_corr, annot=True, ax=ax[0])

# Masked Figure
threshold = 0
DF_mask = DF_corr.copy()
DF_mask[DF_mask < threshold] = 0
sns.heatmap(DF_mask, annot=True, ax=ax[1])

# Annotating
Ar_annotation = DF_mask.as_matrix()
Ar_annotation[Ar_annotation == 0] = None
Ar_annotation
# array([[ 1. , nan, 0.87175416, 0.81795363],
# [ nan, 1. , nan, nan],
# [ 0.87175416, nan, 1. , 0.9627571 ],
# [ 0.81795363, nan, 0.9627571 , 1. ]])
print(DF_mask.shape, Ar_annotation.shape)
# (4, 4) (4, 4)

sns.heatmap(DF_mask, annot=Ar_annotation, fmt="")

# ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()


enter image description here

Before mask (left), after mask (right)

Answer

That's easy!

Update to 0.7.1 and restart Jupyter kernel.

https://github.com/mwaskom/seaborn/issues/981