Após um intensivão em Pandas, nossa base de dados está perfeita para obtermos o resultado que queríamos, que é um mapa coroplético do resultado eleitoral.
Pensei em finalizar o projeto neste tópico mas quero destrinchar mais as possibilidades de mapas, então talvez esta não seja a última parte do projeto. Fica a dúvida no ar haha
Dando uma recapitulada em nosso geodataframe final

Vamos plotar o resultado agora.
Destrinchando como a lib matplotlib plota um mapa, vamos iniciar do básico.
fig, ax = plt.subplots() # Cria duas variáveis, uma será a figura e a outra os eixos
plt.show() # Mostra os subplots

Temos um plano de fundo para o plot do mapa. Vamos testar plotando somente o mapa por cima desses eixos.
fig, ax = plt.subplots()
df_final.plot(ax=ax) # Tenho que dizer que vou plotar o mapa no mesmo eixo criado acima
plt.show()

Posso aumentar o tamanho do meu mapa incluindo como parâmetro dos subplots o parâmetro figsize, passando uma tupla com valores de largura e altura. Posso também adicionar um título para o gráfico e uma legenda logo abaixo, e também sumir com os eixos. Vamos fazer essas etapas antes de colorir o mapa:
fig, ax = plt.subplots(figsize=(12, 12))
df_final.plot(ax=ax)
plt.title('Resultado 1º turno - Eleições presidenciais - 2018', fontdict={'fontsize': '24', 'fontweight': '3'})
ax.annotate('Fonte: IBGE (2015); TSE (2018)', xy=(0.1, 0.1), xycoords='figure fraction', fontsize=10, color='grey')
ax.axis('off')
plt.show()
Em plt.title, temos o texto e um dicionário responsável pela fonte do texto.
Em ax.annotate, adicionamos uma nota de rodapé ao mapa, com a fonte dos dados, a localização no plano cartesiano da legenda, o sistema de coordenadas usado (que foi o da figura), o tamanho da fonte e a cor da fonte.
Em ax.axis('off'), eu sumo com os eixos. Por fim, mostro o mapa.

Agora vamos colorir os municípios com os resultados.
Eu posso simplesmente passar como parâmetro para df_final.plot a coluna que quero que seja a responsável pela diferença nos resultados e o matplotlib já colore automaticamente pra gente. Vou passar também como parâmetro que quero legenda no mapa e o esquema de cores que eu quero. Os esquemas de cores disponíveis por padrão podem ser vistos neste link:
Choosing Colormaps in Matplotlib — Matplotlib 3.1.0 documentationNo meu caso vou usar a opção "Dark2":

O código:
fig, ax = plt.subplots(figsize=(12, 12))
df_final.plot(column='NM_CANDIDATO', ax=ax, legend=True, cmap='Dark2')
plt.title('Resultado 1º turno - Eleições presidenciais - 2018', fontdict={'fontsize': '24', 'fontweight': '3'})
ax.annotate('Fonte: IBGE (2015); TSE (2018)', xy=(0.1, 0.1), xycoords='figure fraction', fontsize=10, color='grey')
ax.axis('off')
plt.show()
Resultado:

Podemos também customizar as cores, usando o módulo do matplotlib chamado ListedColormap. Passamos uma lista de cores e o matplotlib irá associar cada cor com o candidato e plotar a cor correspondente. Irei passar cores usando o formato hexadecimal. Um gerador de cores que gera no formato hexadecimal também:
https://htmlcolorcodes.com/from matplotlib.colors import ListedColormap
cmap = ListedColormap(['#4daf4a', '#377eb8', '#e41a1c'])
fig, ax = plt.subplots(figsize=(12, 12))
df_final.plot(column='NM_CANDIDATO', ax=ax, legend=True, cmap=cmap)
plt.title('Resultado 1º turno - Eleições presidenciais - 2018', fontdict={'fontsize': '24', 'fontweight': '3'})
ax.annotate('Fonte: IBGE (2015); TSE (2018)', xy=(0.1, 0.1), xycoords='figure fraction', fontsize=10, color='grey')
ax.axis('off')
plt.show()
E o plot:

Achei o primeiro esquema menos indutor de briga política

(e mudei as cores que se esperava que iriam aparecer em cada região de propósito

).
Por fim, podemos salvar a figura usando a função savefig:
fig, ax = plt.subplots(figsize=(12, 12))
df_final.plot(column='NM_CANDIDATO', ax=ax, legend=True, cmap='Dark2')
plt.title('Resultado 1º turno - Eleições presidenciais - 2018', fontdict={'fontsize': '24', 'fontweight': '3'})
ax.annotate('Fonte: IBGE (2015); TSE (2018)', xy=(0.1, 0.1), xycoords='figure fraction', fontsize=10, color='grey')
ax.axis('off')
fig.savefig('resultado eleitoral.png', dpi=300)
plt.show()
A figura salva (ampliem para ver os detalhes):

E pra finalizar, manipulamos tanto nosso dataframe, mas ele só existe no ambiente jupyter. Eu posso transformar o dataframe em arquivo do excel para posterior conferência e uso em outros projetos, da seguinte forma:
df_final.to_excel('resultado eleitoral.xlsx')
Irá ser criado em nossa pasta raiz o arquivo Excel com os nossos dados.
Enfim, podemos dizer que o projeto está praticamente finalizado. Vocês podem tentar criar os resultados pra um estado, ou pegar o resultado do segundo turno, ou da eleição de outro ano. Por aqui, vou tentar explorar mais esses mapas e tentar criar mapas de forma diferente. O planejado era chegar até aqui mas tou com vontade de explorar mais essa base de dados criando outros tipos de mapas. Vamos ver o que virá haha
Depois vou colocar em meu GitHub todo o arquivo do projeto pra facilitar a visualização posterior de quem interessar.