Ruota il testo dell'etichetta nel fattore del fattore di nascita


152

Ho un semplice diagramma dei fattori

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

inserisci qui la descrizione dell'immagine

Il problema è che le etichette x funzionano tutte insieme, rendendole illeggibili. Come si ruota il testo in modo che le etichette siano leggibili?


29
import matplotlib.pylab as plt. plt.xticks(rotation=‌​45)
rafaelvalle,

La libreria Dexplot ha la capacità di avvolgere le etichette, impostare la dimensione della figura, dpi tutto senza usare matplotlib.
Ted Petrou,

Risposte:


137

Aman ha ragione nel dire che puoi usare i normali comandi matplotlib, ma questo è anche incorporato in 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)

inserisci qui la descrizione dell'immagine

Ci sono alcuni commenti e un'altra risposta che afferma che "non funziona", tuttavia, chiunque può eseguire il codice come scritto qui e vedere che funziona. L'altra risposta non fornisce un esempio riproducibile di ciò che non funziona, rendendolo molto difficile da affrontare, ma la mia ipotesi è che le persone stanno cercando di applicare questa soluzione all'output di funzioni che restituiscono un Axesoggetto anziché a Facet Grid. Queste sono cose diverse e il Axes.set_xticklabels()metodo richiede davvero un elenco di etichette e non può semplicemente modificare le proprietà delle etichette esistenti su Axes. La lezione è che è importante prestare attenzione al tipo di oggetti con cui stai lavorando.


Viene visualizzato un errore: IndexError: troppi indici. Il mio codice! g = sns.factorplot ("month_date", "num_proposals", "account", Sort_data, col = "account", col_wrap = 3, sharex = False); g.set_xticklabels (rotazione = 30)
yoshiserry

10
@soupault - ha funzionato per me, simile a quello che hai inventato ma forse un po 'più pulito - per ax in g.axes.flatten (): ax.set_xticklabels (ax.get_xticklabels (), rotazione = 30)
odedbd

6
Utilizzare ha="right"per allineare al centro le etichette dell'asse x ai segni di spunta. vale a direg.set_xticklabels([label1, label2], rotation=30, ha='right')
Manavalan Gajapathy,

72
simile a un paio di osservazioni di cui sopra, questo mi ha dato un errore fino a quando ho cambiato g.set_xticklabels(rotation=30)a g.set_xticklabels(g.get_xticklabels(), rotation=30)grazie a questa risposta: stackoverflow.com/a/39689464/1870832
Max Power

1
Alcuni metodi di stampa Seaborn restituiscono un FacetGridoggetto, altri restituiscono un Axesoggetto Matplotlib . Per il primo, non impostare le etichette funzionerà, per il secondo no. Puoi vedere quali sono gli FacetGridoggetti guardando la documentazione: seaborn.pydata.org/api.html . Ad esempio, se lo usi g = sns.catplot()funzionerà, ma sns.barplot()non perché restituirà un Axesoggetto.
getup8

253

Ho avuto un problema con la risposta di @mwaskorn, ovvero quello

g.set_xticklabels(rotation=30)

fallisce, perché questo richiede anche le etichette. Un po 'più semplice della risposta di @Aman è semplicemente aggiungere

plt.xticks(rotation=45)

33
Puoi anche ottenere le etichette in questo modo g.set_xticklabels(g.get_xticklabels(), rotation=30). Assegnalo a una variabile se vuoi sopprimere l'output.
Joelostblom,

3
Penso che sia corretto, quando l'impostazione ha plt.xticsfunzionato per me.
muammar,

ho provato tutte le opzioni di cui sopra per una trama di violino e plt.xticks (rotazione = n) è solo uno che ho potuto mettere al lavoro
A Rob4,

29

Questo è ancora un oggetto matplotlib. Prova questo:

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

8

Se qualcuno si chiede come fare per CorrGrids clustermap (parte di un dato esempio 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()

6

Puoi anche usare plt.setpcome segue:

import matplotlib.pyplot as plt
import seaborn as sns

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

per ruotare le etichette di 90 gradi.


5

Per a seaborn.heatmap, puoi ruotarli usando (basato sulla risposta di @ 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

1
questo ha funzionato per me, solo passando in rotazione param non ha fatto nulla, ho dovuto passare anche le etichette per farlo funzionare
Raveen Beemsingh

0

Tutte le trame marittime supportate da facetgrid non funzioneranno con (es. Catplot)

g.set_xticklabels(rotation=30) 

tuttavia barplot, countplot, ecc. funzioneranno in quanto non supportati da facetgrid. Di seguito funzionerà per loro.

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

Inoltre, se hai 2 grafici sovrapposti uno sopra l'altro, prova set_xticklabels sul grafico che lo supporta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.