Faire pivoter le texte de l'étiquette dans le diagramme factoriel marin

152

J'ai un diagramme factoriel simple

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

entrez la description de l'image ici

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

dan
la source
29
import matplotlib.pylab as plt. plt.xticks(rotation=‌​45)
rafaelvalle
La bibliothèque Dexplot a la capacité d'envelopper des étiquettes, de définir la taille de la figure, le dpi tout cela sans utiliser matplotlib.
Ted Petrou le

Réponses:

137

Aman a raison de dire que vous pouvez utiliser les commandes matplotlib normales, mais cela est également intégré dans 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)

entrez la description de l'image ici

Il y a quelques commentaires et une autre réponse affirmant que cela "ne fonctionne pas", cependant, n'importe qui peut exécuter le code tel qu'il est é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 le rend très difficile à résoudre, mais je suppose que les gens essaient d'appliquer cette solution à la sortie de fonctions qui renvoient un Axesobjet au lieu d'un Facet Grid. Ce sont des choses différentes, et la Axes.set_xticklabels()méthode nécessite en effet une liste d'étiquettes et ne peut pas simplement modifier les propriétés des étiquettes existantes sur le Axes. La leçon est qu'il est important de prêter attention au type d'objets avec lesquels vous travaillez.

mwaskom
la source
J'obtiens une erreur: IndexError: trop d'indices. Mon code! g = sns.factorplot ("month_date", "num_proposals", "account", sorted_data, col = "account", col_wrap = 3, sharex = False); g.set_xticklabels (rotation = 30)
yoshiserry
10
@soupault - cela a fonctionné pour moi, similaire à ce que vous avez trouvé mais peut-être un peu plus propre - pour ax dans g.axes.flatten (): ax.set_xticklabels (ax.get_xticklabels (), rotation = 30)
odedbd
6
Utilisez ha="right"pour centrer les étiquettes de l'axe X sur leurs graduations. ieg.set_xticklabels([label1, label2], rotation=30, ha='right')
Manavalan Gajapathy
73
similaire à quelques commentaires ci-dessus, cela m'a donné une erreur jusqu'à ce que je passe g.set_xticklabels(rotation=30)à g.set_xticklabels(g.get_xticklabels(), rotation=30)grâce à cette réponse: stackoverflow.com/a/39689464/1870832
Max Power
1
Certaines méthodes de traçage Seaborn renvoient un FacetGridobjet, d'autres un Axesobjet Matplotlib . Pour le premier, ne pas définir les étiquettes fonctionnera, pour le second, ce ne sera pas le cas. Vous pouvez voir quels sont les FacetGridobjets en consultant la documentation: seaborn.pydata.org/api.html . Par exemple, si vous l'utilisez, g = sns.catplot()cela fonctionnera, mais sns.barplot()pas car il renvoie un Axesobjet.
getup8
253

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 simplement d'ajouter

plt.xticks(rotation=45)
Gijs
la source
33
Vous pouvez également obtenir les étiquettes comme ça g.set_xticklabels(g.get_xticklabels(), rotation=30). Affectez-le à une variable si vous souhaitez supprimer la sortie.
joelostblom
3
Je pense que c'est correct, lorsque le réglage a plt.xticsfonctionné pour moi.
muammar
essayé toutes les options ci-dessus pour une intrigue de violon et plt.xticks (rotation = n) est le seul que j'ai pu me mettre au travail
A Rob4
29

C'est toujours un objet matplotlib. Essaye ça:

# <your code here>
locs, labels = plt.xticks()
plt.setp(labels, rotation=45)
Un homme
la source
8

Si quelqu'un se demande comment faire cela pour Clustermap CorrGrids (partie d'un exemple Seaborn donné):

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()
user5875384
la source
6

Vous pouvez également utiliser plt.setpcomme suit:

import matplotlib.pyplot as plt
import seaborn as sns

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

pour faire pivoter les étiquettes de 90 degrés.

Robvh
la source
5

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
serv-inc
la source
1
cela a fonctionné pour moi, le simple fait de passer en paramètre de rotation ne faisait rien, je devais également passer les étiquettes pour que cela fonctionne
Raveen Beemsingh
0

Toutes les parcelles Seaborn supportées par facetgrid ne fonctionneront pas avec (par exemple, catplot)

g.set_xticklabels(rotation=30) 

cependant barplot, countplot, etc. fonctionneront car ils ne sont pas pris en charge par facetgrid. Ci-dessous fonctionnera pour eux.

g.set_xticklabels(g.get_xticklabels(), rotation=30)

De plus, si vous avez 2 graphiques superposés l'un sur l'autre, essayez set_xticklabels sur le graphique qui le prend en charge.

rishi jain
la source