Obróć tekst etykiety w Seaaborn factorplot


152

Mam prosty wykres

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

wprowadź opis obrazu tutaj

Problem polega na tym, że wszystkie etykiety x biegną razem, przez co są nieczytelne. Jak obrócić tekst, aby etykiety były czytelne?


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

Biblioteka Dexplot ma zdolność do zawijania etykiety określone teh rozmiaru rysunku dpi wszystko bez użycia matplotlib.
Ted Petrou

Odpowiedzi:


137

Aman ma rację, że możesz używać normalnych poleceń matplotlib, ale jest to również wbudowane w 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)

wprowadź opis obrazu tutaj

Jest kilka komentarzy i inna odpowiedź twierdząca, że ​​to „nie działa”, jednak każdy może uruchomić kod tak, jak tu napisano i zobaczyć, że działa. Druga odpowiedź nie daje powtarzalne przykład tego, co nie działa, co jest bardzo trudne do adresu, ale wydaje mi się, że ludzie starają się zastosować to rozwiązanie na wyjście funkcji, które zwracają się Axesobiekt zamiast Facet Grid. Są to różne rzeczy, a Axes.set_xticklabels()metoda rzeczywiście wymaga listy etykiet i nie może po prostu zmienić właściwości istniejących etykiet w pliku Axes. Lekcja jest taka, że ​​ważne jest, aby zwracać uwagę na rodzaj obiektów, z którymi pracujesz.


Pojawia się błąd: IndexError: za dużo indeksów. Mój kod! g = sns.factorplot ("data_miesiąca", "liczba_propozycji", "konto", sortowane_dane, col = "konto", col_wrap = 3, sharex = False); g.set_xticklabels (rotacja = 30)
yoshiserry,

10
@soupault - to zadziałało dla mnie, podobnie do tego, co wymyśliłeś, ale być może trochę czystsze - dla topora w g.axes.flatten (): ax.set_xticklabels (ax.get_xticklabels (), obrót = 30)
odedbd

6
Użyj, ha="right"aby wyśrodkować, wyrównać etykiety osi X do ich znaczników. tj.g.set_xticklabels([label1, label2], rotation=30, ha='right')
Manavalan Gajapathy

72
podobny do kilku uwag powyższych, to dał mi błąd, dopóki nie zmieniły g.set_xticklabels(rotation=30)się g.set_xticklabels(g.get_xticklabels(), rotation=30)dzięki tej odpowiedzi: stackoverflow.com/a/39689464/1870832
moc max

1
Niektóre metody kreślenia Seaborn zwracają FacetGridobiekt, inne zwracają Axesobiekt Matplotlib . W pierwszym przypadku nie ustawianie etykiet będzie działać, w drugim nie. Możesz zobaczyć, które to FacetGridobiekty, przeglądając dokumentację: seaborn.pydata.org/api.html . Na przykład, jeśli używasz g = sns.catplot()tego, zadziała, ale sns.barplot()nie zadziała, ponieważ zwraca Axesobiekt.
getup 8

252

Miałem problem z odpowiedzią @mwaskorn, a mianowicie

g.set_xticklabels(rotation=30)

nie udaje się, ponieważ wymaga to również etykiet. Nieco łatwiej niż odpowiedzią @Aman jest po prostu dodać

plt.xticks(rotation=45)

33
Możesz również uzyskać takie etykiety g.set_xticklabels(g.get_xticklabels(), rotation=30). Przypisz go do zmiennej, jeśli chcesz ukryć dane wyjściowe.
joelostblom

3
Myślę, że to jest poprawne, gdy ustawienie plt.xticszadziałało dla mnie.
muammar

wypróbowałem wszystkie powyższe opcje dla wykresu skrzypcowego, a plt.xticks (rotacja = n) jest jedyną, którą mogłem zabrać do pracy
A Rob4

29

To wciąż jest obiekt matplotlib. Spróbuj tego:

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

8

Jeśli ktoś się zastanawia, jak to zrobić dla clustermap CorrGrids (fragment podanego przykładu z morskim):

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

Możesz również użyć plt.setpw następujący sposób:

import matplotlib.pyplot as plt
import seaborn as sns

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

obrócić etykiety o 90 stopni.


5

W przypadku a seaborn.heatmap, możesz je obracać za pomocą (na podstawie odpowiedzi @ 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
to zadziałało dla mnie, samo przekazanie parametru rotacji nic nie dało, musiałem również przekazać etykiety, aby to
zadziałało

0

Żadne działki z roślinami morskimi obsługiwane przez facetgrid nie będą działać (np. Catplot)

g.set_xticklabels(rotation=30) 

jednak barplot, countplot itp. będą działać, ponieważ nie są obsługiwane przez facetgrid. Poniżej będzie działać dla nich.

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

Ponadto, jeśli masz 2 wykresy nałożone jeden na drugi, wypróbuj set_xticklabels na wykresie, który to obsługuje.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.