2015-11-25 4 views
7

Ich versuche, eine 2x1 subplot Figur in Seaborn zu machen mit:Seaborn erzeugt getrennte Zahlen in Nebenhandlungen

data = pandas.DataFrame({"x": [1, 2, 4], 
         "y": [10,20,40], 
         "s": [0.01,0.1,1.0]}) 

plt.figure() 
plt.subplot(2, 1, 1) 
sns.pointplot(x="x", y="y", data=data) 
plt.errorbar(np.arange(len(data["x"])), data["y"], yerr=data["s"]) 
plt.subplot(2, 1, 2) 
sns.factorplot(x="x", y="y", data=data) 
plt.show() 

es erzeugt zwei separate Zahlen statt eine einzige Figur mit zwei Handlungsstränge. warum tut es das und wie kann seaborn mehrfach für separate unterplots aufgerufen werden?

Ich habe versucht, auf den Beitrag unten verwiesen, aber ich kann nicht sehen, wie die Unterplattformen hinzugefügt werden können, auch wenn factorplot zuerst aufgerufen wird. Kann jemand ein Beispiel dafür zeigen? Es wäre hilfreich. mein Versuch:

data = pandas.DataFrame({"x": [1, 2, 4], 
         "y": [10,20,40], 
         "s": [0.01,0.1,1.0]}) 

fig = plt.figure() 
sns.pointplot(x="x", y="y", data=data) 
ax = sns.factorplot(x="x", y="y", data=data) 
fig.add_subplot(212, axes=ax) 
plt.errorbar(np.arange(len(data["x"])), data["y"], yerr=data["s"]) 
plt.show() 
+0

Mögliche Duplikat [mit Seaborn Trägt man die matplotlib objektorientierte Schnittstelle] (http: // stackoverflow.com/questions/23969619/plotting-with-seaborn-using-the-matplotlib-object-oriented-interface) – mwaskom

+0

@mwaskom: Ich sah das, aber nicht sehen, wie es die Frage seit '' factorplot'' doesn beantwortet nimm ein "ax =" Argument. es klingt wie es unmöglich ist zu tun? Ich möchte die Schönheit von Seaborn '' factorplot'' bekommen, aber einfach in einem Subplot. – lgd

Antwort

8

Das Problem ist, dass factorplot eine neue FacetGrid Instanz erstellt (was wiederum seine eigene Figur erzeugt), auf das es eine Plotten Funktion (pointplot Standardeinstellung) gilt. Wenn Sie also nur pointplot möchten, ist es sinnvoll, nur pointplot und nicht factorplot zu verwenden.

Das folgende ist ein bisschen wie ein Hack, wenn Sie wirklich aus irgendeinem Grund wollen, sagen factorplot die Axes seine auf Plotten auszuführen. Wie @mwaskom in den Kommentaren betont, ist dies kein unterstütztes Verhalten. Es könnte also in Zukunft nicht funktionieren.

Sie können factorplot sagen auf einer bestimmten Axes mit dem ax kwarg zu zeichnen, die nach unten zu matplotlib weitergegeben werden, so wird die verknüpfte Antwort Art der Anfrage beantworten. Es wird jedoch immer noch die zweite Zahl wegen des Aufrufs factorplot erstellen, aber diese Zahl wird nur leer sein. Eine Abhilfe hier ist es, dass zusätzliche Figur zu schließen, bevor plt.show()

Zum Beispiel ruft:

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

data = pandas.DataFrame({"x": [1, 2, 4], 
         "y": [10,20,40], 
         "s": [10,10,10]}) # I increased your errors so I could see them 

# Create a figure instance, and the two subplots 
fig = plt.figure() 
ax1 = fig.add_subplot(211) 
ax2 = fig.add_subplot(212) 

# Tell pointplot to plot on ax1 with the ax argument 
sns.pointplot(x="x", y="y", data=data, ax=ax1) 

# Plot the errorbar directly on ax1 
ax1.errorbar(np.arange(len(data["x"])), data["y"], yerr=data["s"]) 

# Tell the factorplot to plot on ax2 with the ax argument 
# Also store the FacetGrid in 'g' 
g=sns.factorplot(x="x", y="y", data=data, ax=ax2) 

# Close the FacetGrid figure which we don't need (g.fig) 
plt.close(g.fig) 

plt.show() 

enter image description here

+2

Das funktioniert, weil 'factorplot' seine Kwargs durchlässt, also der' ax' Parameter an die richtige Stelle kommt, aber dieses Verhalten ist nicht ' t unterstützt und ich würde mich nicht darauf verlassen. – mwaskom

+0

@mwaskom, einverstanden, aber weißt du einen besseren Weg, es zu tun? Nur gedacht, das könnte jetzt nützlich sein. – tom

+2

Es gibt eine grundlegende Verwirrung. 'factorplot' wendet nur eine Plotfunktion (' pointplot') auf ein Raster von Unterplots an, die von 'FacetGrid' verwaltet werden. Es macht keinen Sinn zu versuchen, einen "factorplot" auf einen vorhandenen Subplot zu zeichnen. Verwenden Sie einfach "pointplot". – mwaskom

Verwandte Themen