2016-04-21 6 views
3

Ich spiele zum ersten Mal mit Seaborn und versuche verschiedene Spalten eines Pandas-Datenrahmens auf verschiedenen Plots mit Matplotlib-Subplots zu plotten. Der folgende einfache Code erzeugt die erwartete Zahl, aber der letzte Plot hat keinen richtigen y-Bereich (er scheint mit dem gesamten Bereich der Werte im Datenrahmen verbunden zu sein). Hat jemand eine Idee, warum das passiert und wie man das verhindert? Vielen Dank.falscher y-Achsenbereich mit Matplotlib-Subplots und Seaborn

import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pds 
import seaborn as sns 

X = np.arange(0,10) 
df = pds.DataFrame({'X': X, 'Y1': 4*X, 'Y2': X/2., 'Y3': X+3, 'Y4': X-7}) 

fig, axes = plt.subplots(ncols=2, nrows=2) 
ax1, ax2, ax3, ax4 = axes.ravel() 
sns.set(style="ticks") 
sns.despine(fig=fig) 

sns.regplot(x='X', y='Y1', data=df, fit_reg=False, ax=ax1) 
sns.regplot(x='X', y='Y2', data=df, fit_reg=False, ax=ax2) 
sns.regplot(x='X', y='Y3', data=df, fit_reg=False, ax=ax3) 
sns.regplot(x='X', y='Y4', data=df, fit_reg=False, ax=ax4) 

plt.show() 

enter image description here

Update: Ich änderte den obigen Code mit:

fig, axes = plt.subplots(ncols=2, nrows=3) 
ax1, ax2, ax3, ax4, ax5, ax6 = axes.ravel() 

Wenn ich Daten plotten auf jeder Achse, aber der letzte, den ich bekommen, was ich suche: enter image description here Natürlich will ich die leeren Frames nicht. Alle Plots präsentieren die Daten mit einem ähnlichen visuellen Aspekt. Wenn Daten auf der letzten Achse geplottet werden, erhält sie einen y-Bereich, der wie im ersten Beispiel zu groß ist. Nur die letzte Achse scheint dieses Problem zu haben. Irgendeine Ahnung?

+0

Dank für die reproduzierbare Beispiel. Es würde helfen, wenn Sie den erwarteten y-Bereich angeben würden. –

+0

Ja, tut mir leid, ich hätte genauer sein sollen. Ich habe meinen Beitrag bearbeitet, um dies mit einem Beispiel dieser Art von Arbeiten zu verdeutlichen, indem ich 6 Achsen erstelle und nur 4 davon benutze. Es ist hässlich, aber du wirst sehen, wonach ich suche. Vielen Dank. – Volty

Antwort

1

Wenn Sie wollen, dass die Waage gleich sein auf allen Achsen Sie Nebenhandlungen mit diesem Befehl erstellen können:

fig, axes = plt.subplots(ncols=2, nrows=2, sharey=True, sharex=True) 

, die alle Plots machen entsprechende Achse zu teilen:

enter image description here

Wenn Sie die Grenzen dieses speziellen ax manuell ändern möchten, können Sie diese Zeile am Ende der Zeichenbefehle hinzufügen:

ax4.set_ylim(top=5) 

# or for both limits like this: 
# ax4.set_ylim([-2, 5]) 

die so etwas wie diese geben wird:

enter image description here

+0

Danke für Ihre Antwort. Der zweite Graph ist, was ich suche, aber ich wünschte, ich hätte den Bereich nicht "manuell" angeben müssen. Das Seltsame ist, wenn ich eine dritte Reihe (oder Spalte) von Achsen erzeuge, aber nur auf den ersten 4 oder 5 Achsen plane, bekomme ich den gewünschten Graph (aber mit 2 leeren Achsen). Nur die letzte Achse als breiterer Bereich von y-Werten. Ich habe meinen Beitrag bearbeitet, um dieses Verhalten widerzuspiegeln. – Volty

+0

Nun "manuell" bedeutet in diesem Fall, dass Sie jede Achse beliebig viele ___nice___ Werte annehmen lassen können. Sie müssen nicht jedes Mal die Zahlen eingeben. Es sollte ausreichend sein, um so etwas in Ihrem Code zu haben, um sicherzustellen, dass der Bereich _nice_ ist: 'ax4.set_ylim ([df.Y4.min() - 1, df.Y4.max() + 1])' – Primer