2015-11-25 5 views
7

sto cercando di fare una sottotrama 2x1 figura Seaborn utilizzando:Seaborn produce dati separati in sottotrame

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() 

produce due figure separati invece di un singolo dato con due sottotrame. perché fa questo e come può Seaborn essere chiamato più volte per sottotrame separate?

Ho provato a guardare il post di cui sotto ma non riesco a vedere come si possono aggiungere le sottotrame anche se factorplot viene chiamato per primo. qualcuno può mostrare un esempio di questo? sarebbe utile. il mio tentativo:

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

Possibile duplicato di [Tracciare con Seaborn utilizzando l'interfaccia orientata agli oggetti matplotlib] (http: // stackoverflow.com/questions/23969619/plotting-with-seaborn-using-the-matplotlib-object-oriented-interface) – mwaskom

+0

@mwaskom: l'ho visto ma non vedo come risponde alla domanda dato che '' factorplot'' doesn 'prendere un argomento '' ax = ''. sembra che sia impossibile da fare? voglio ottenere la bellezza di seaborn '' factorplot'', ma semplicemente all'interno di una sottotrama – lgd

risposta

8

Il problema è che factorplot crea una nuova istanza FacetGrid (che a sua volta crea la propria figura), su cui si applica una funzione di tracciato (pointplot per impostazione predefinita). Quindi, se tutto ciò che si desidera è il pointplot, sarebbe opportuno utilizzare solo pointplot e non factorplot.

Quello che segue è un po 'di un hack, se si davvero desidera, per qualsiasi ragione, dire che factorplotAxes di svolgere la sua tracciato su. Come @mwaskom fa notare nei commenti, questo non è un comportamento supportato, quindi mentre potrebbe funzionare ora, potrebbe non avvenire in futuro.

Si può dire factorplot per tracciare su un dato Axes utilizzando il ax kwarg, che viene trasmesso fino a matplotlib, quindi la risposta legata non sorta di rispondere alla vostra domanda. Tuttavia, continuerà a creare la seconda cifra a causa della chiamata factorplot, ma quella cifra sarà vuota. Una soluzione qui per chiudere questa cifra in più prima di chiamare plt.show()

Ad esempio:

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

Questo "funziona" perché "factorplot' passa i suoi kwarg attraverso, quindi il parametro' ax' arriva nel posto giusto, ma questo comportamento in particolare non è t supportato e non mi fiderei di esso. – mwaskom

+0

@mwaskom, d'accordo, ma conosci un modo migliore per farlo? Ho pensato che per ora potrebbe essere utile – tom

+2

C'è una confusione fondamentale. 'factorplot' applica semplicemente una funzione di tracciamento (' pointplot' di default) su una griglia di sottotrame gestita da un 'FacetGrid'. Non ha senso cercare di disegnare un 'factorplot' su una sottotrama esistente. Basta usare 'pointplot'. – mwaskom