Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Não entendo o que está acontecendo no subplot

Quando está sendo gerado um subplot com vários gráficos eu não entendo o que o código está fazendo.

plt.figure(figsize=(16,12))
ax = plt.subplot(2,1,1)
ax.set_title ('Vendas Cafelura 2017 e 2018', fontsize = 18)
sns.lineplot(x= 'mes', y='vendas', data = cafelura)
ax = plt.subplot(2,1,2)
ax.set_title ('Vendas Normalizadas Cafelura 2017 e 2018', fontsize = 18)
sns.lineplot(x= 'mes', y='vendas_normalizadas', data = cafelura)
ax=ax

Primeiro eu determino o tramanho da figura.

Depois eu crio uma variável que "ax" que é o espaço do subplot. Digo o título e faço o lineplot.

O ax é um subplot e ele tem uma função set title, posteriormente eu apenas faço o sns.lineplot, não tendo nada a ver com o ax. Como o código entende que isso tem a ver com o subplot total?

Depois eu faço a mesma coisa para o outro gráfico. Dúvida, quando eu faço novamente "ax= ..." o código não deveria sobrescrever a variável na memória?

Porque eu faço o "ax =ax"?

2 respostas
solução!

Olá Guilherme, tudo bem ? Espero que sim.

"Como o código entende que isso tem a ver com o subplot total?"

O Seaborn por usar o matplotlib internamente é capaz de pegar o contexto e utilizar o ultimo axes criado.

"ax : matplotlib.axes.Axes

Pre-existing axes for the plot. Otherwise, call matplotlib.pyplot.gca() internally."(Fonte: https://seaborn.pydata.org/generated/seaborn.lineplot.html)

Essa é uma característica do matplolib, você pode ou não omitir muitos parâmetros e ter os mesmo resultados.

Criei esses códigos como exemplo para ajudar a entender isso.

Primeiro importei o seaborn e o matplotlib:

import seaborn as sns
import matplotlib.pyplot as plt 

Depois carreguei uns dados de exemplo do próprio seaborn.

dots = sns.load_dataset("dots").query("align == 'dots'")
dots.head()

Agora, utilizei o seu código nesses dados, só retirei a parte do ax=ax que é desnecessária porque não tem nenhum efeito. (Porque eu faço o "ax =ax"?)

fig = plt.figure(figsize=(16,12))
ax = plt.subplot(2,1,1)
ax.set_title ('Vendas Cafelura 2017 e 2018', fontsize = 18)
sns.lineplot(x= 'coherence', y='firing_rate', data = dots)
ax = plt.subplot(2,1,2)
ax.set_title ('Vendas Normalizadas Cafelura 2017 e 2018', fontsize = 18)
sns.lineplot(x= 'time', y='firing_rate', data = dots)
plt.show()

Nesse segundo exemplo, deixei de omitir o parâmetro de ax, então invés de o matplotlib utilizar o ultimo axes criado ele vai usar o que eu mandei para ele.

plt.figure(figsize=(16,12))

ax1 = plt.subplot(2,1,1)
ax2 = plt.subplot(2,1,2)

ax1.set_title ('Vendas Cafelura 2017 e 2018', fontsize = 18)
ax2.set_title ('Vendas Normalizadas Cafelura 2017 e 2018', fontsize = 18)

sns.lineplot(x= 'coherence', y='firing_rate', data = dots, ax=ax1)
sns.lineplot(x= 'time', y='firing_rate', data = dots, ax=ax2)

plt.show()

Nesse terceiro exemplo utilizei o subplots que vai me trazer uma lista de Axes, e posso acessar eles e usar como parâmetros no seaborn novamente.

fig, axs = plt.subplots(nrows=2, ncols=1, figsize=(16,12))

axs[0].set_title ('Vendas Cafelura 2017 e 2018', fontsize = 18)

axs[1].set_title ('Vendas Normalizadas Cafelura 2017 e 2018', fontsize = 18)

sns.lineplot(x= 'coherence', y='firing_rate', data = dots, ax=axs[0])
sns.lineplot(x= 'time', y='firing_rate', data = dots, ax=axs[1])

plt.show()

Todos esse exemplos geram a mesma figura com dois gráficos, recomendo que entenda cada um desses exemplos, porque assim vai ficar mais confortável com o funcionamento do matplotlib.

Espero ter esclarecido suas duvidas, mas qualquer coisa não hesite em perguntar.

Bons Estudos.

(Colab com os exemplos)