Plotando com seaborn usando a interface orientada a objetos matplotlib

103

Eu prefiro fortemente usar matplotlibno estilo OOP:

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

Isso torna mais fácil acompanhar várias figuras e subtramas.

Pergunta: Como usar o seaborn dessa forma? Ou, como alterar este exemplo para o estilo OOP? Como seabornidentificar funções de plotagem como lmplotquais Figureou para quais Axesplotagens?

Chama Congelada
fonte
1
Relacionado: Este problema e esta resposta para uma possível solução alternativa, que permitiria criar uma figura do mar e mover todos os eixos para uma grade de subtrama posteriormente.
ImportanceOfBeingErnest

Respostas:

228

Depende um pouco de qual função marítima você está usando.

As funções de plotagem no mar são amplamente divididas em duas classes

  • Funções "de nível Machados", incluindo regplot, boxplot, kdeplote muitos outros
  • Funções de "nível Figura", incluindo lmplot, factorplot, jointplote um ou dois outros

O primeiro grupo é identificado pegando um axargumento explícito e retornando um Axesobjeto. Como isso sugere, você pode usá-los em um estilo "orientado a objetos" passando seu Axespara eles:

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

As funções no nível dos eixos apenas desenharão em um Axese não bagunçarão a figura de outra forma, para que possam coexistir perfeitamente em um script matplotlib orientado a objetos.

O segundo grupo de funções (nível de Figura) distingue-se pelo fato de que o enredo resultante pode potencialmente incluir vários Eixos que são sempre organizados de uma forma "significativa". Isso significa que as funções precisam ter controle total sobre a figura, de modo que não é possível plotar, digamos, uma lmplotsobre uma que já existe. Chamar a função sempre inicializa uma figura e a configura para o gráfico específico que está desenhando.

No entanto, depois de chamado lmplot, ele retornará um objeto do tipo FacetGrid. Este objeto possui alguns métodos para operar na trama resultante que conhecem um pouco sobre a estrutura da trama. Ele também expõe a figura subjacente e a matriz de eixos nos argumentos FacetGrid.fige FacetGrid.axes. A jointplotfunção é muito semelhante, mas usa um JointGridobjeto. Portanto, você ainda pode usar essas funções em um contexto orientado a objetos, mas toda a sua customização deve vir depois de você chamar a função.

Mwaskom
fonte
Isso foi realmente útil. Dê uma olhada na minha resposta aqui: stackoverflow.com/questions/27019079/…
denson