It might be a good idea to use annotations from the annot=True , which are created by annot=True and then shift their width one and a half pixels up and half the width of the pixel. For this offset position to be the upper left corner of the text itself, the arguments ha and va keyword must be set to annot_kws . The shift itself can be performed using translational conversion.
import seaborn as sns import numpy as np; np.random.seed(0) import matplotlib.pylab as plt import matplotlib.transforms data = np.random.randint(100, size=(5,5)) akws = {"ha": 'left',"va": 'top'} ax = sns.heatmap(data, annot=True, annot_kws=akws) for t in ax.texts: trans = t.get_transform() offs = matplotlib.transforms.ScaledTranslation(-0.48, 0.48, matplotlib.transforms.IdentityTransform()) t.set_transform( offs + trans ) plt.show()

The behavior is a bit incompatible, as +0.48 in the transformation shifts the label up (against the direction of the axes). This behavior is apparently corrected in the marine version 0.8; for plots on the seashore of 0.8 or higher, use a more intuitive conversion
offs = matplotlib.transforms.ScaledTranslation(-0.48, -0.48, matplotlib.transforms.IdentityTransform())
source share