Hoe een aantal xlim en ylim in te stellen in Seaborn lmplot facetgrid

Ik gebruik sns.lmplotom een ​​lineaire regressie te plotten, waarbij ik mijn dataset in twee groepen verdeel met een categorische variabele.

Voor zowel x als y wil ik de ondergrenshandmatig instellen op beide plots, maar de bovengrensop de Seaborn-standaard laten staan.
Hier is een eenvoudig voorbeeld:

import pandas as pd
import seaborn as sns
import numpy as np
n = 200
np.random.seed(2014)
base_x = np.random.rand(n)
base_y = base_x * 2
errors = np.random.uniform(size=n)
y = base_y + errors
df = pd.DataFrame({'X': base_x, 'Y': y, 'Z': ['A','B']*(100)})
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)

Dit levert het volgende op:
voer hier de afbeeldingsbeschrijving in

Maar in dit voorbeeld wil ik dat de xlim en de ylim (0,*) zijn. Ik heb geprobeerd sns.plt.ylim en sns.plt.xlim te gebruiken, maar die hebben alleen invloed op de rechter plot.
Voorbeeld:

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

voer hier de afbeeldingsbeschrijving in

Hoe krijg ik toegang tot de xlim en ylim voor elk perceel in de FacetGrid?


Antwoord 1, autoriteit 100%

De functie lmplotretourneert een FacetGrid-instantie. Dit object heeft een methode genaamd set, waaraan u key=value-paren kunt doorgeven en deze worden ingesteld op elk Axes-object in het raster.

Ten tweede kun je slechts één kant van een Axes-limiet in matplotlib instellen door Nonedoor te geven voor de waarde die je als standaard wilt behouden.

Als we deze samenvoegen, hebben we:

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

voer hier de afbeeldingsbeschrijving in

Bijwerken

  • Positieargumenten, sharexen shareyworden afgekeurd vanaf seaborn 0.11
g = sns.lmplot(x='X', y='Y', data=df, col='Z', facet_kws={'sharey': False, 'sharex': False})
g.set(ylim=(0, None))

Antwoord 2, autoriteit 51%

Je moet de bijlen zelf pakken. Waarschijnlijk de schoonste manier is om je laatste rij te veranderen:

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

Dan kun je de assenobjecten (een array van assen) pakken:

axes = lm.axes

Daarna kunt u de eigenschappen van de assen aanpassen

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

creëert:

voer hier de afbeeldingsbeschrijving in

Other episodes