Faça mais de um gráfico na mesma célula do Notebook IPython

87

Comecei meu notebook IPython com

ipython notebook --pylab inline

Este é o meu código em uma célula

df['korisnika'].plot()
df['osiguranika'].plot()

Isso está funcionando bem, ele desenhará duas linhas, mas no mesmo gráfico.

Eu gostaria de desenhar cada linha em um gráfico separado. E seria ótimo se os gráficos estivessem próximos um do outro, não um após o outro.

Eu sei que posso colocar a segunda linha na próxima célula, e então obteria dois gráficos. Mas eu gostaria que os gráficos estivessem próximos uns dos outros, porque eles representam a mesma unidade lógica.

WebOrCode
fonte

Respostas:

88

Faça os vários eixos primeiro e passe-os para a função de gráfico Pandas, como:

fig, axs = plt.subplots(1,2)

df['korisnika'].plot(ax=axs[0])
df['osiguranika'].plot(ax=axs[1])

Ainda dá a você 1 figura, mas com dois gráficos diferentes próximos um do outro.

Rutger Kassies
fonte
3
Isso está funcionando. Agora não vou mudar o tamanho da imagem. Posso fazer isso com fig, axs = plt.subplots (1,2, figsize = (15, 5)). Existe alguma maneira de definir o tamanho da imagem em pixels?
WebOrCode
1
Usar o tamanho da figura é de fato o caminho, esse é o tamanho em polegadas. Quantos pixels serão depende do dpi, que é fixo para exibição na tela. Mas para salvá-lo pode ser definido adicionando a palavra-chave dpi.
Rutger Kassies
2
Não é muito preciso que o dpi seja fixo para exibição na tela (bem é e não é). O IPython exibe imagens com base puramente em seu tamanho de pixel, e esse tamanho de pixel é determinado em matplotlib multiplicando o tamanho da figura em polegadas pela savefig.dpiconfiguração. As figuras embutidas usam o mesmo caminho savefig usado para gravar arquivos.
minrk
Obrigado por apontar isso, eu não sabia que funcionava assim. Não seria mais conveniente se o dpi da exibição fosse levado em consideração (também), já que isso é fácil de configurar na criação da figura. Para o savefig.dpi eu não conheço outra maneira a não ser mpl.rcParams['savefig.dpi'] = 120. Para o dpi da tela, há uma palavra-chave em vários lugares, como plt.figure(dpi=120), mas ela está ignorada agora, por isso minha suposição errada sobre ela ter sido corrigida.
Rutger Kassies
101

Você também pode chamar a função show () após cada gráfico. por exemplo

   plt.plot(a)
   plt.show()
   plt.plot(b)
   plt.show()
Tooblippe
fonte
1
Ótimo, mas como definir a localização da imagem do enredo, como (2,2) ou (1,2)?
Pythoner
3
Com esta opção, os gráficos aparecem necessariamente um após o outro. Para obter mais controle sobre o layout geral, pyplot.subplots()é o caminho a percorrer.
Eric O Lebigot,
1
Eu removi o link.
Tooblippe
12

Algo assim:

import matplotlib.pyplot as plt
... code for plot 1 ...
plt.show()
... code for plot 2...
plt.show()

Observe que isso também funcionará se você estiver usando o seabornpacote para plotagem:

import matplotlib.pyplot as plt
import seaborn as sns
sns.barplot(... code for plot 1 ...) # plot 1
plt.show()
sns.barplot(... code for plot 2 ...) # plot 2
plt.show()
mgoldwasser
fonte
11

Outra maneira, para variedade. Embora isso seja um pouco menos flexível do que os outros. Infelizmente, os gráficos aparecem um acima do outro, em vez de lado a lado, o que você solicitou em sua pergunta original. Mas é muito conciso.

df.plot(subplots=True)

Se o dataframe tiver mais do que as duas séries e você quiser apenas plotar essas duas, será necessário substituir dfpor df[['korisnika','osiguranika']].

Luciano
fonte
2

Não sei se esta é uma nova funcionalidade, mas isso será plotado em figuras separadas:

df.plot(y='korisnika')
df.plot(y='osiguranika')

enquanto isso será plotado na mesma figura: (assim como o código no op)

df.plot(y=['korisnika','osiguranika'])

Eu encontrei esta pergunta porque estava usando o método anterior e queria que eles traçassem a mesma figura, então sua pergunta foi na verdade minha resposta.

Steven
fonte