Trazar con seaborn usando la interfaz orientada a objetos matplotlib

103

Prefiero usar matplotliben estilo OOP:

f, axarr = plt.subplots(2, sharex=True)
axarr[0].plot(...)
axarr[1].plot(...)

Esto facilita el seguimiento de varias figuras y subtramas.

Pregunta: ¿Cómo usar seaborn de esta manera? O, ¿cómo cambiar este ejemplo al estilo OOP? ¿Cómo distinguir seabornfunciones de trazado como a lmplotcuál Figureo Axesa?

Llama congelada
fuente
1
Relacionado: este problema y esta respuesta son una posible solución alternativa, que permitiría crear una figura nacida en el mar y mover todos los ejes a una cuadrícula de subtrama más adelante.
ImportanceOfBeingErnest

Respuestas:

228

Depende un poco de qué función seaborn esté utilizando.

Las funciones de trazado en seaborn se dividen ampliamente en dos clases

  • Funciones "Ejes nivel", incluyendo regplot, boxplot, kdeplot, y muchos otros
  • Funciones de "nivel Figura", incluyendo lmplot, factorplot, jointploty uno o dos otros

El primer grupo se identifica tomando un axargumento explícito y devolviendo un Axesobjeto. Como sugiere esto, puede usarlos en un estilo "orientado a objetos" pasándoles su Axes:

f, (ax1, ax2) = plt.subplots(2)
sns.regplot(x, y, ax=ax1)
sns.kdeplot(x, ax=ax2)

Las funciones de nivel de ejes solo se dibujarán en una Axesfigura y no se enredarán con la figura, por lo que pueden coexistir perfectamente y felizmente en un script matplotlib orientado a objetos.

El segundo grupo de funciones (nivel de figura) se distingue por el hecho de que la gráfica resultante puede incluir potencialmente varios ejes que siempre están organizados de una manera "significativa". Eso significa que las funciones deben tener un control total sobre la figura, por lo que no es posible trazar, digamos, una lmplotsobre una que ya existe. Llamar a la función siempre inicializa una figura y la configura para el gráfico específico que está dibujando.

Sin embargo, una vez que haya llamado lmplot, devolverá un objeto del tipo FacetGrid. Este objeto tiene algunos métodos para operar en la trama resultante que conocen un poco sobre la estructura de la trama. También expone la figura subyacente y la matriz de ejes en los argumentos FacetGrid.figy FacetGrid.axes. La jointplotfunción es muy similar, pero usa un JointGridobjeto. Por lo tanto, aún puede usar estas funciones en un contexto orientado a objetos, pero toda su personalización debe realizarse después de haber llamado a la función.

mwaskom
fuente
Esto fue realmente útil. Eche un vistazo a mi respuesta aquí: stackoverflow.com/questions/27019079/…
denson