So stellen Sie xlim und ylim in Seaborn lmplot facetgrid ein

85

Ich verwende Seaborns lmplot, um eine lineare Regression zu zeichnen, und teile meinen Datensatz in zwei Gruppen mit einer kategorialen Variablen auf.

Sowohl für x als auch für y möchte ich die Untergrenze für beide Diagramme manuell festlegen , aber die Obergrenze bei der Seaborn-Standardeinstellung belassen. Hier ist ein einfaches Beispiel:

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)

Dies gibt Folgendes aus: Geben Sie hier die Bildbeschreibung ein

In diesem Beispiel möchte ich jedoch, dass xlim und ylim (0, *) sind. Ich habe versucht, sns.plt.ylim und sns.plt.xlim zu verwenden, aber diese wirken sich nur auf die Darstellung auf der rechten Seite aus. Beispiel:

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

Geben Sie hier die Bildbeschreibung ein

Wie kann ich für jedes Diagramm im FacetGrid auf xlim und ylim zugreifen?

exp1orer
quelle
4
Übrigens, wenn Sie sich mit dem numpy.randomModul vertraut machen , können Sie sich viel Zeit sparen, indem Sie zufällige Daten generieren (was sehr nützlich sein kann!). Zum Beispiel könnten Sie bekommen base_xund base_ymit base_x = np.random.rand(n); base_y = base_x * 2. Die yVariable kann dann auf ähnliche Weise mit vektorisierten Operationen erzeugt werden.
Mwaskom

Antworten:

144

Die lmplotFunktion gibt eine FacetGridInstanz zurück. Dieses Objekt hat eine Methode namens set, an die Sie übergeben könnenkey=value Paare übergeben können. Diese werden für jedes Axes-Objekt im Raster festgelegt.

Zweitens können Sie in matplotlib nur eine Seite eines Achsenlimits festlegen, indem Sie übergeben None Sie den Wert übergeben, den Sie als Standardwert möchten.

Wenn wir diese zusammenstellen, haben wir:

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

Geben Sie hier die Bildbeschreibung ein

mwaskom
quelle
4
Whoa, das ist einfach. In den Dokumenten scheint g.setsich jede Nebenhandlung zu ändern. Ist der Ansatz von g.axes die empfohlene Methode, um jeden von ihnen separat einzustellen?
Exp1orer
6
Ja, wenn Sie eine Eigenschaft für eine (oder mehrere, aber nicht alle) Facetten g.axesfestlegen möchten, sollten Sie das Array verwenden, wie von DrV vorgeschlagen.
Mwaskom
1
Dies sollte die akzeptierte Antwort sein. 5 Jahre später und es funktioniert immer noch und ist effizienter als die akzeptierte Antwort.
Bbennett36
81

Sie müssen die Achsen selbst ergreifen. Der wahrscheinlich sauberste Weg ist, die letzte Zeile zu ändern:

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

Dann können Sie die Achsenobjekte (ein Array von Achsen) erfassen:

axes = lm.axes

Danach können Sie die Achseneigenschaften anpassen

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

erstellt:

Geben Sie hier die Bildbeschreibung ein

DrV
quelle