DataBach
DataBach

Reputation: 1635

How can I rotate annotated seaborn heatmap data and legend?

I created to a seaborn heatmap to summarize Teils_U coefficients. The data is horizontally displayed in the heatmap. Now, I would like to rotate the data and the legend. I know that you can roate the x axis and y axis labels in a plot, but how can I rotate the data and the legend ?

This is my code:

#creates padnas dataframe to hold the values
theilu = pd.DataFrame(index=['Y'],columns=matrix.columns)
#store column names in variable columns
columns = matrix.columns

#iterate through each variable
for j in range(0,len(columns)):
    #call teil_u function on "ziped" independant and dependant variable -> respectivley x & y in the functions section
    u = theil_u(matrix['Y'].tolist(),matrix[columns[j]].tolist())
    #select respecive columns needed for output
    theilu.loc[:,columns[j]] = u
    #handle nans if any  
    theilu.fillna(value=np.nan,inplace=True)

 #plot correlation between fraud reported (y) and all other variables (x)
 plt.figure(figsize=(20,1))
 sns.heatmap(theilu,annot=True,fmt='.2f')
 plt.show()

Here an image of what I am looking for:

enter image description here

Please let me know if you need and sample data or the teil_u function to recreate the problem. Thank you

Upvotes: 4

Views: 9194

Answers (2)

JohanC
JohanC

Reputation: 80449

The parameters of the annotation can be changed via annot_kws. One of them is the rotation.

Some parameters of the colorbar can be changed via cbar_kwsdict, but the unfortunately the orientation of the labels isn't one of them. Therefore, you need a handle to the colorbar's ax. One way is to create an ax beforehand, and pass it to sns.heatmap(..., cbar_ax=ax). An easier way is to get the handle afterwards: cbar = heatmap.collections[0].colorbar.

With this ax handle, you can change more properties of the colorbar, such as the orientation of its labels. Also, their vertical alignment can be changed to get them centered.

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

data = np.random.rand(1, 12)
fig, ax = plt.subplots(figsize=(10,2))
heatmap = sns.heatmap(data, cbar=True, ax=ax,
                      annot=True, fmt='.2f', annot_kws={'rotation': 90})
cbar = heatmap.collections[0].colorbar
# heatmap.set_yticklabels(heatmap.get_yticklabels(), rotation=90)
heatmap.set_xticklabels(heatmap.get_xticklabels(), rotation=90)
cbar.ax.set_yticklabels(cbar.ax.get_yticklabels(), rotation=90, va='center')
plt.tight_layout()
plt.show()

example plot

Upvotes: 9

Diziet Asahi
Diziet Asahi

Reputation: 40737

You can pass argument to ax.text() (which is used to write the annotation) using the annot_kws= argument.

Therefore:

flights = sns.load_dataset("flights")
flights = flights.pivot("month", "year", "passengers")
fig, ax = plt.subplots(figsize=(8,8))
ax = sns.heatmap(flights, annot=True, fmt='d', annot_kws={'rotation':90})

enter image description here

Upvotes: 3

Related Questions