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?

dan
źródło
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.

mwaskom
źródło
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)
Gijs
źródło
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)
Mężczyzna
źródło
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()
user5875384
źródło
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.

Robvh
źródło
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
serv-inc
źródło
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.

rishi jain
źródło