web-dev-qa-db-fra.com

Modification de la rotation des étiquettes des ticks dans la carte thermique Seaborn

Je trace une carte thermique à Seaborn. Le problème est que j'ai trop de carrés dans mon tracé, donc les étiquettes x et y sont trop proches l'une de l'autre pour être utiles. Je crée donc une liste de xticks et yticks à utiliser. Cependant, le passage de cette liste à la fonction fait pivoter les étiquettes dans le tracé. Ce serait vraiment bien d'avoir Seaborn laisser tomber automatiquement certaines des tiques, mais à moins que j'aimerais pouvoir avoir les yticks en position verticale.

import pandas as pd
import numpy as np
import seaborn as sns

data = pd.DataFrame(np.random.normal(size=40*40).reshape(40,40))

yticks = data.index
keptticks = yticks[::int(len(yticks)/10)]
yticks = ['' for y in yticks]
yticks[::int(len(yticks)/10)] = keptticks

xticks = data.columns
keptticks = xticks[::int(len(xticks)/10)]
xticks = ['' for y in xticks]
xticks[::int(len(xticks)/10)] = keptticks

sns.heatmap(data,linewidth=0,yticklabels=yticks,xticklabels=xticks)

enter image description here

44
Artturi Björk

seaborn utilise matplotlib en interne, vous pouvez donc utiliser les fonctions matplotlib pour modifier vos tracés. J'ai modifié le code ci-dessous pour utiliser le plt.yticks fonction pour définir rotation=0 qui résout le problème.

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


data = pd.DataFrame(np.random.normal(size=40*40).reshape(40,40))

yticks = data.index
keptticks = yticks[::int(len(yticks)/10)]
yticks = ['' for y in yticks]
yticks[::int(len(yticks)/10)] = keptticks

xticks = data.columns
keptticks = xticks[::int(len(xticks)/10)]
xticks = ['' for y in xticks]
xticks[::int(len(xticks)/10)] = keptticks

sns.heatmap(data,linewidth=0,yticklabels=yticks,xticklabels=xticks)

# This sets the yticks "upright" with 0, as opposed to sideways with 90.
plt.yticks(rotation=0) 

plt.show()

Plot

68
Ffisegydd

Vous pouvez également appeler les méthodes de l'objet heatmap:

    g = sns.heatmap(data,linewidth=0,yticklabels=yticks,xticklabels=xticks)
    g.set_yticklabels(g.get_yticklabels(), rotation = 0, fontsize = 8)

Je ne sais pas pourquoi ce n'est pas dans la documentation de sns.heatmap, mais les mêmes méthodes sont décrites ici: http://seaborn.pydata.org/generated/seaborn.FacetGrid.html

Je crois que ces méthodes sont disponibles pour chaque objet de parc marin, mais je n'ai pas pu trouver d'API générale pour cela.

21