Gráficos de dispersão complexos no Python [PARTE III] – Inserindo rótulos em elementos e definindo mais de uma legenda

Faaaaaaaaaaaaala cientista! Tudo certo?
Lembra do nosso gráfico de dispersão baseado nos dados do IBGE [1]? No último post dessa série vamos deixá-lo ainda melhor. Colocaremos rótulos indicando qual é cada estado, e definiremos duas legendas, relacionadas às regiões e à população. Assim o gráfico ficará bem completo! Vamos lá?

Lembra dos primeiros posts da série ([2], [3])? A partir deles geramos o gráfico a seguir. Os comentários, assim como os posts anteriores, explicam o que cada parte do código faz, OK?

scatter_preliminarII

Veja o código necessário para gerar esse gráfico a seguir:

# importando os pacotes necessários.
import matplotlib.pyplot as plt
import pandas as pd

# lendo o arquivo dados_ibge.xls
dados_brasil = pd.read_excel('dados_ibge.xls', sheetname=2)

# paleta de cores 5-class Dark2, do ColorBrewer2: http://colorbrewer2.org/
cores = ['#1b9e77',
         '#d95f02',
         '#7570b3',
         '#e7298a',
         '#66a61e']

# a função atribui_cor() aponta a cor correspondente a cada região.
def atribui_cor(regiao):
    cores = {
        'Norte':'#1b9e77',
        'Nordeste':'#d95f02',
        'Sudeste':'#7570b3',
        'Sul':'#e7298a',
        'CentroOeste':'#66a61e'
    }
    return cores.get(regiao, 'black')

# criando o vetor de cores.
cor_regiao = list()
qtde_estados = len(dados_brasil['Regiao'])

for estado in range(qtde_estados):
    cor_regiao.append(atribui_cor(dados_brasil['Regiao'][estado]))

# gerando o gráfico.
plt.figure(figsize=(24,16))
plt.scatter(x = dados_brasil['ExpecVida'],
            y = dados_brasil['PIBperCapita'],
            s = dados_brasil['PopX1000'],
            c = cor_regiao,
            alpha = 0.6)
plt.title('Desenvolvimento do Brasil em 2013, por estado', fontsize=22)
plt.xlabel('Expectativa de vida (anos)', fontsize=22)
plt.ylabel('PIB per capita (R$)', fontsize=22)
plt.grid(True)

Continuaremos trabalhando com esse código. Caso precise, baixe o arquivo dados_ibge.xls [4].

Primeiro vamos inserir a sigla dos estados em cada círculo. Usaremos a função text() do matplotlib [5] para colocar os rótulos em cada estado. Os argumentos são as coordenadas do texto na figura (x, y) e uma string, que será o texto exibido (s).

Para que o valor seja facilmente localizado em cima de cada círculo, aproveitaremos as coordenadas e as siglas dadas em dados_brasil. Assim:

  • Para o primeiro estado, x = dados_brasil[‘ExpecVida’][0], y = dados_brasil[‘PIBperCapita’][0] e s = dados_brasil[‘UF’][0];
  • Para o segundo estado, x = dados_brasil[‘ExpecVida’][1], y = dados_brasil[‘PIBperCapita’][1] e s = dados_brasil[‘UF’][1], e assim por diante.

Colocaremos tudo em um comando for, para que não precisemos repetir as instruções várias vezes.

for estado in range(len(dados_brasil['UF'])):
    plt.text(x = dados_brasil['ExpecVida'][estado],
             y = dados_brasil['PIBperCapita'][estado],
             s = dados_brasil['UF'][estado],
             fontsize=16)

E pronto! Rápido, não é mesmo?

Agora colocaremos as legendas. A ideia é adaptar um objeto 2D com as cores que definimos, já que a legenda automática não funcionará nesse caso. Para a primeira legenda definiremos um vetor indicando as regiões, na ordem em que aparecem na nossa tabela:

regioes = ['Norte',
           'Nordeste',
           'Sudeste',
           'Sul',
           'Centro-Oeste']

Definimos então os objetos baseados na ideia de [6]. Aqui criamos uma lista e adicionamos elementos com as cores presentes no nosso vetor cores. Para criarmos esses elementos, precisaremos do pacote matplotlib.lines. Após criar a lista, utilizamos regioes e legend1_line2d para gerarmos uma legenda com a função legend(). Há vários argumentos além desses; tente modificá-los para ver o que eles representam!

import matplotlib.lines as mlines

legend1_line2d = list()
for passo in range(len(cores)):
    legend1_line2d.append(mlines.Line2D([0], [0], linestyle="none",
                                       marker="o", alpha=0.6, markersize=15,
                                       markerfacecolor=cores[passo]))

legend1 = plt.legend(legend1_line2d, regioes, numpoints=1, fontsize=22, loc="best", shadow=True)

Vamos então à segunda legenda. A criação da lista é parecida, mas há vários recursos avançados aqui. Eles aparecem comentados no código, para que você entenda melhor:

legend2_line2d = list()
legend2_line2d.append(mlines.Line2D([0], [0], linestyle="none",
                                       marker="o", alpha=0.6, markersize=np.sqrt(100),
                                       markerfacecolor='#D3D3D3'))
legend2_line2d.append(mlines.Line2D([0], [0], linestyle="none",
                                       marker="o", alpha=0.6, markersize=np.sqrt(1000),
                                       markerfacecolor='#D3D3D3'))
legend2_line2d.append(mlines.Line2D([0], [0], linestyle="none",
                                       marker="o", alpha=0.6, markersize=np.sqrt(10000),
                                       markerfacecolor='#D3D3D3'))

legend2 = plt.legend(legend2_line2d,
                     ['1', '10', '100'],
                     title='População (em 100.000)',
                     numpoints=1,
                     fontsize=20,
                     loc="upper left",
                     frameon=False,  # sem bordas
                     labelspacing=3, # aumenta o espaçamento entre os rótulos
                     handlelength=5, # aumenta o espaçamento entre o objeto e o texto
                     borderpad=4     # aumenta a borda da legenda
                    )
plt.gca().add_artist(legend1)

plt.setp(legend2.get_title(),fontsize=22)  # aumentando o tamanho da fonte da legenda

Por fim, usamos plt.show() para exibir o gráfico. Veja o resultado a seguir:

scatter_finalPTBR.jpg

Nessa série de posts empregamos vários elementos da linguagem Python, desde os mais básicos até alguns avançados. Agora conseguimos olhar para o gráfico e ter mais informações do que apenas ver uma tabela, não é mesmo? O código completo para esse gráfico está disponível [7]! Corre lá baixar e estudar!

Gostou do resultado? O que você faria diferente? Tem mais ideias sobre dados a estudar? Escreva pra gente nos comentários!

Valeu cientista! Um giga abraço e até a próxima!


Gostou? Curta e compartilhe com seus amigos!
Quer baixar os códigos do Programando Ciência? Corre lá no nosso GitHub!
Faça uma doação pro Programando Ciência!
Curta a gente também no Facebook: www.facebook.com/programandociencia
Estou no Twitter! Siga-me se puder! @alexdesiqueira

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s