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.