Jak ustawić niektóre xlim i ylim w Seaborn lmplot facetgrid

85

Używam lmplot Seaborna do wykreślenia regresji liniowej, dzieląc mój zestaw danych na dwie grupy ze zmienną kategorialną.

Zarówno dla x, jak i y, chciałbym ręcznie ustawić dolną granicę na obu wykresach, ale górną granicę zostawić jako domyślną Seaborn. Oto prosty przykład:

import pandas as pd
import seaborn as sns
import random

n = 200
random.seed(2014)
base_x = [random.random() for i in range(n)]
base_y = [2*i for i in base_x]
errors = [random.uniform(0,1) for i in range(n)]
y = [i+j for i,j in zip(base_y,errors)]

df = pd.DataFrame({'X': base_x,
                   'Y': y,
                   'Z': ['A','B']*(n/2)})

mask_for_b = df.Z == 'B'
df.loc[mask_for_b,['X','Y']] = df.loc[mask_for_b,] *2

sns.lmplot('X','Y',df,col='Z',sharex=False,sharey=False)

To daje następujące wyniki: wprowadź opis obrazu tutaj

Ale w tym przykładzie chciałbym, aby xlim i ylim były (0, *). Próbowałem użyć sns.plt.ylim i sns.plt.xlim, ale te dotyczą tylko wykresu po prawej stronie. Przykład:

sns.plt.ylim(0,)
sns.plt.xlim(0,)

wprowadź opis obrazu tutaj

Jak mogę uzyskać dostęp do xlim i ylim dla każdej działki w FacetGrid?

exp1orer
źródło
4
Przy okazji, jeśli zapoznasz się z numpy.randommodułem, możesz zaoszczędzić sobie dużo czasu na generowaniu losowych danych (co może być bardzo przydatne!). Na przykład, można dostać base_xi base_yz base_x = np.random.rand(n); base_y = base_x * 2. yZmienna może być następnie podobnie generowane z vectorized operacje.
mwaskom

Odpowiedzi:

143

lmplotZwraca się FacetGridwystąpienie. Ten obiekt ma wywoływaną metodę set, do której można przekazywać key=valuepary, które zostaną ustawione na każdym obiekcie Axes w siatce.

Po drugie, możesz ustawić tylko jedną stronę limitu osi w matplotlib, przekazując Nonewartość, która ma pozostać domyślna.

Łącząc je razem, mamy:

g = sns.lmplot('X', 'Y', df, col='Z', sharex=False, sharey=False)
g.set(ylim=(0, None))

wprowadź opis obrazu tutaj

mwaskom
źródło
4
Whoa, to łatwe. Patrząc w dokumentację, wydaje się, że g.setzmienia się każdy wątek cząstkowy. Czy g.axes podchodzą do zalecanego sposobu ustawiania każdego z nich osobno?
exp1orer
6
Tak, jeśli chciałeś ustawić jakąś właściwość na jednym (lub więcej, ale nie wszystkich) aspektach, powinieneś użyć g.axestablicy, jak sugeruje DrV.
mwaskom
1
To powinna być akceptowana odpowiedź. 5 lat później i nadal działa i jest wydajniejszy niż przyjęta odpowiedź.
bbennett36
81

Musisz samemu chwycić siekiery. Prawdopodobnie najczystszym sposobem jest zmiana ostatniego wiersza:

lm = sns.lmplot('X','Y',df,col='Z',sharex=False,sharey=False)

Następnie możesz zdobyć obiekty osi (tablicę osi):

axes = lm.axes

Następnie możesz dostosować właściwości osi

axes[0,0].set_ylim(0,)
axes[0,1].set_ylim(0,)

tworzy:

wprowadź opis obrazu tutaj

DrV
źródło