1
resposta

[Dúvida] Como fazer com o FixedLocator?

# Usando só o Matplotlib.pyplot.
plt.plot(df_4_am_lat.loc['Brazil', anos], 'darkgreen', linewidth=1, label='Brazil')
plt.plot(df_4_am_lat.loc['Argentina', anos], 'blue', linewidth=1, label='Argentina')
plt.plot(df_4_am_lat.loc['Peru', anos], 'black', linewidth=1, label='Peru')
plt.plot(df_4_am_lat.loc['Colombia', anos], 'red', linewidth=1, label='Colombia')
plt.legend(loc='upper left', title='Países')
plt.xticks([str(i) for i in range(1980,2015, 5)] + ['2013'], fontsize=10)
plt.title("Imigração ao Canadá de 1980 a 2013", fontsize=15)
plt.xlabel('Anos', fontsize=10)
plt.ylabel("Número de imigrantes", fontsize=10)
plt.show()

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

# Continuando com o Seaborn
df_4_am_lat_anos = df_4_am_lat[anos].transpose()

import matplotlib.ticker as ticker

fig, ax = plt.subplots(figsize=(8,4))
ax = sns.lineplot(df_4_am_lat_anos, dashes=False, palette='tab10')
ax.legend(loc='upper left', title='Países')
plt.xticks(fontsize=10)
plt.title("Imigração ao Canadá de 1980 a 2013", fontsize=15)
plt.xlabel('Anos', fontsize=10)
plt.ylabel("Número de imigrantes", fontsize=10)
ax.xaxis.set_major_locator(ticker.MultipleLocator(3))

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Então, tentei fazer com FixedLocator, li partes da documentação, mas ainda fiquei confuso e os anos não apareceram:

fig, ax = plt.subplots(figsize=(8,4))
ax = sns.lineplot(df_4_am_lat_anos, dashes=False)
ax.legend(loc='upper left', title='Países')
plt.xticks(fontsize=10)
plt.title("Imigração ao Canadá de 1980 a 2013", fontsize=15)
plt.xlabel('Anos', fontsize=10)
plt.ylabel("Número de imigrantes", fontsize=10)
ax.xaxis.set_major_locator(ticker.FixedLocator(anos_selecionados))

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Oii, Estudante! Como vai?

Isso pode ocorrer porque o FixedLocator exige que a lista criada contendo os anos dentro de anos_selecionados esteja coerente com a base de dados e sua posição, e ainda que estejam em posições específicas e não uniformemente espaçadas, que infelizmente é como estar no nosso projeto. Caso não esteja, o retorno não será feito como esperado. Além de ser menos flexível quanto a manutenção, ela precisa ser feita manualmente.

Em contraposto, temos a sugestão da Instrutora em Ver opinião do Instrutor, na qual ela usa o método MultipleLocator, que retorna exatamente os dados passados no eixo e de forma automática dentro do intervalo que você escolheu.

Para entender mais sobre essa diferença entre os dois métodos, recomendo a leitura da documentação:

Segue também o código com o uso do MultipleLocator:

sns.set_theme()
sns.set_palette('Dark2')

fig, ax = plt.subplots(figsize=(10, 5))
ax = sns.lineplot(df.loc['Brasil', anos], label='Brasil', lw=3)
ax = sns.lineplot(df.loc['Argentina', anos], label='Argentina', lw=3)
ax = sns.lineplot(df.loc['Peru', anos], label='Peru', lw=3)
ax = sns.lineplot(df.loc['Colômbia', anos], label='Colômbia', lw=3)

ax.set_title('Imigração dos maiores países da América do Sul\npara o Canadá de 1980 a 2013', loc='left', fontsize=20)
ax.set_xlabel('Ano', fontsize=14)
ax.set_ylabel('Número de imigrantes', fontsize=14)

ax.xaxis.set_major_locator(plt.MultipleLocator(5))

ax.legend(title='Países', loc='upper right', bbox_to_anchor=(1.18, 1.02))

plt.show()

Espero ter ajudado. Bons estudos e até mais!