web-dev-qa-db-fra.com

Faire pivoter le texte de l'étiquette dans la représentation graphique Seaborn

J'ai un factorplot simple

import seaborn as sns
g = sns.factorplot("name", "miss_ratio", "policy", dodge=.2, 
    linestyles=["none", "none", "none", "none"], data=df[df["level"] == 2])

enter image description here

Le problème est que les étiquettes x fonctionnent toutes ensemble, ce qui les rend illisibles. Comment faites-vous pivoter le texte pour que les étiquettes soient lisibles?

107
dan

Aman a raison de dire que vous pouvez utiliser les commandes normales de matplotlib, mais cela est également intégré à FacetGrid :

import seaborn as sns
planets = sns.load_dataset("planets")
g = sns.factorplot("year", data=planets, aspect=1.5, kind="count", color="b")
g.set_xticklabels(rotation=30)

enter image description here

Il y a quelques commentaires et une autre réponse affirmant que cela "ne fonctionne pas", cependant, tout le monde peut exécuter le code tel qu'écrit ici et voir qu'il fonctionne. L’autre réponse ne fournit pas un exemple reproductible de ce qui ne fonctionne pas, ce qui la rend très difficile à traiter, mais j’imagine que les gens essaient d’appliquer cette solution à la sortie de fonctions qui retournent un objet Axes au lieu d’un Facet Grid. Ce sont des choses différentes, et la méthode Axes.set_xticklabels() requiert en effet une liste d'étiquettes et ne peut pas simplement changer les propriétés des étiquettes existantes sur Axes. La leçon est qu'il est important de faire attention au type d'objets avec lesquels vous travaillez.

100
mwaskom

J'ai eu un problème avec la réponse de @ mwaskorn, à savoir que

g.set_xticklabels(rotation=30)

échoue, car cela nécessite également les étiquettes. Un peu plus facile que la réponse de @Aman est d’ajouter

plt.xticks(rotation=45)
195
Gijs

Ceci est toujours un objet matplotlib. Essaye ça:

# <your code here>
locs, labels = plt.xticks()
plt.setp(labels, rotation=45)
27
Aman

Si quelqu'un se demande comment faire pour ceci pour clustermap CorrGrids (partie d'un exemple donné avec seaborn):

import seaborn as sns
import matplotlib.pyplot as plt
sns.set(context="paper", font="monospace")

# Load the datset of correlations between cortical brain networks
df = sns.load_dataset("brain_networks", header=[0, 1, 2], index_col=0)
corrmat = df.corr()

# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(12, 9))

# Draw the heatmap using seaborn
g=sns.clustermap(corrmat, vmax=.8, square=True)
rotation = 90 
for i, ax in enumerate(g.fig.axes):   ## getting all axes of the fig object
     ax.set_xticklabels(ax.get_xticklabels(), rotation = rotation)


g.fig.show()
4
user5875384

Pour un seaborn.heatmap , vous pouvez les faire pivoter en utilisant (en fonction de la réponse de @ Aman )

_pandas_frame = pd.DataFrame(data, index=names, columns=names)
heatmap = seaborn.heatmap(pandas_frame)
loc, labels = plt.xticks()
heatmap.set_xticklabels(labels, rotation=45)
heatmap.set_yticklabels(labels[::-1], rotation=45) # reversed order for y
_
4
serv-inc

Vous pouvez également utiliser plt.setp comme suit:

import matplotlib.pyplot as plt
import seaborn as sns

plot=sns.barplot(data=df,  x=" ", y=" ")
plt.setp(plot.get_xticklabels(), rotation=90)

faire pivoter les étiquettes de 90 degrés.

2
Robvh