Visualização de dados com Python e Matplotlib
Mais importante que saber tratar e processar dados, é saber como apresentá-los em seus relatórios, sites e apresentações. A linguagem de programação Python possui uma série de ferramentas e bibliotecas para trabalharmos com visualização de dados e criar apresentações gráficas compreensíveis e simples.
Vamos ver algumas definições e como funciona o processo de criação de um gráfico em 2 exemplos práticos.
Vamos ver algumas definições e como funciona o processo de criação de um gráfico em 2 exemplos práticos.
Oque são datasets
Datasets são uma coleção de dados
normalmente tabulados. Para cada elemento nessa coleção são indicadas diversas características representadas por colunas e, para cada linha, possuímos o elemento em si e suas respectivas características.
Cada valor é conhecido como um dado.
Cada valor é conhecido como um dado.
Oque são data frames
Data frames são, basicamente, matrizes nas quais suas colunas possuem nomes e podem conter dados de diferentes tipos. Pode ser identificado como uma tabela de uma base de dados, em que cada linha, representa um registro.
Matplotlib é uma biblioteca para o python para criação de gráficos e visualizações de dados em geral.
Oque são gráficos
Gráficos são uma forma de expressar visualmente dados ou valores numéricos, de maneiras diferentes, visando facilitar compreensão dos mesmos.Python e matplotlib
Python trata-se de uma linguagem de programação de alto nível, de tipagem dinâmica. Pessoalmente, o python é minha linguagem de programação favorita, pela capacidade de fazer coisas incriveis de forma muito simples e pela sua extensa comunidade.Matplotlib é uma biblioteca para o python para criação de gráficos e visualizações de dados em geral.
Plotando informações em um gráfico de linhas
Primeiro precisamos importar para nossa aplicação as bibliotecas e o dataset que utilizaremos para este exemplo. Nesse caso, utilizarei um a respeito da taxa de crimes na Suécia, (disponibilizarei o download do dataset ao final do post).
Importaremos a dependências:
Importaremos a dependências:
![]() | |
Importando as dependências para nossa aplicação |
import pandas as pd: Importamos a biblioteca "pandas" para o nosso projeto e, por convenção, damos o apelido "pd".
import matplotlib.pyplot as plt: Aqui estamos importando o micro-framework pyplot da biblioteca matplotlib e, por convenção, damos o apelido "plt".
df = pd.read_csv('original.csv'): Precisamos agora carregar o nosso dataset para o projeto, para isso utilizaremos a biblioteca "pandas" que importamos anteriormente. Utilizamos o método "read_csv" para carregamos o dataset que esta em formato ".csv" em um dataframe de nome "df".
df.fillna(0, inplace=True): Em alguns casos, datasets podem conter dados faltantes, descritos como "NaN". Nesses casos podemos utilizar o método "fillna" para substituir estes valores faltantes por um de nosso interesse. Nesee exemplo, substituímos todos os valores faltantes por 0. O parâmetro "inplace=True" e utilizado para aplicarmos as alterações na própria variável.
Agora que temos todas as dependências carregadas em nossa aplicação, podemos imprimir nossa primeira prévia. Para isso utilizaremos as ferramentas de plotagem do pyplot para criar um gráfico de linhas no qual iremos relacionar o numero de crimes totais e o numero de crimes de fraude na Suécia entre os anos de 1950 e 2015. Os dados estão formatados da seguinte forma:
Gráficos de linhas são construidos sob 2 eixos: X e Y. No caso do nosso exemplo, o eixo X representará o ano e o eixo Y representará o total de crimes e o total de crimes de fraude, plotados em um mesmo plano cartesiano, com cores diferentes para diferenciação. Para isto utilizamos o método "plot" do pyplot para desenharmos os eixos e definirmos a cor:
![]() | |
Prévia dos dados |
Gráficos de linhas são construidos sob 2 eixos: X e Y. No caso do nosso exemplo, o eixo X representará o ano e o eixo Y representará o total de crimes e o total de crimes de fraude, plotados em um mesmo plano cartesiano, com cores diferentes para diferenciação. Para isto utilizamos o método "plot" do pyplot para desenharmos os eixos e definirmos a cor:
![]() | |
Plotando um grafico de linhas |
plt.plot(df['Year'], df['crimes.total'], '-r'): Plotamos em nosso gráfico a serie que representa os crimes totais. O primeiro parâmetro 'df['year']', imprime no eixo X o período de tempo em anos contido em nosso dataset, O segundo parâmetro 'df['crimes.total']', imprime no eixo Y o total de crimes respectivos a cada ano impresso no eixo X. O terceiro parâmetro '-r', define que a cor da linha será vermelha/red.
plt.plot(df['Year'], df['fraud'], '-b'): Como fizemos no trecho de código da linha 7, plotamos agora a série que representa o total de crimes de fraude respectivos a cada ano impresso no eixo X e, no terceiro parâmetro '-b', definimos como azul/blue a cor da linha para diferenciar da linha de crimes totais.
plt.show(): O método 'show()' do pyplot apresenta o gráfico que foi desenhado no plano cartesiano, importante frisar que a imagem não será salva, apenas apresentada.
O resultado esperado é um gráfico de linhas, onde o eixo X representa uma serie temporal de 65 anos e o eixo Y um intervalo numérico representando o numero de crimes totais(em vermelho) e numero de crimes de fraude(em azul) na Suécia:
![]() |
Previa do gráfico |
Percebam que, apesar de imprimirmos o gráfico como esperado, ele não está fácil de compreender, como deveria ser. Não temos legendas e rótulos para os eixos e temos um pequeno desvio no começo e final do gráfico, com espaços faltando. Alguém que veja este gráfico pela primeira vez sem conhecimento prévio do que esta sendo apresentado, provavelmente vai ficar sem entender. A noticia boa e que o matplotlib e o pyplot fornecem-nos uma serie de ferramentas úteis para customizarmos nossos gráficos. Vamos dar uma olhada em algumas dessas ferramentas:
Legendas, label e definindo limites nos eixos do gráfico
As legendas em um gráfico são um dos elementos mais importantes e que não podemos esquecer de incluir quando apresentarmos nosso trabalho a alguém. O pyplot nos fornece formas simples de adicionarmos legendas diretamente na declaração das series que plotaremos através da keyword "label".
plt.plot(df['Year'], df['crimes.total'], '-r', label='total de crimes'): No mesmo trecho de código de antes, onde plotamos a serie de crimes totais, agora definimos o texto da legenda que desejamos utilizando a keyword "label" e o texto desejado.
plt.plot(df['Year'], df['fraud'], '-b', label='total de fraudes'): Da mesma forma, fazemos com a serie do total de fraudes.
plt.legend(loc='upper left'): Definir as labels não apresentará as legendas automaticamente, precisamos ainda definir uma localização para elas. Escolhemos o lugar onde menos vai atrapalhar a visualização das informações. Neste caso, a esquerda superior vai servir perfeitamente, visto que as linhas do gráfico não tocam aquele ponto.Depois de adicionadas as legendas, precisamos identificar os eixos e dar um titulo ao nosso gráfico:
plt.ylabel('Quantidade'): Para definimos um rotulo para os eixos de nossos gráficos precisamos especificar em qual eixo queremos o rotulo, neste caso utilizamos o método 'ylabel' para o eixo Y. Note que o prefixo 'y' esta presente, e define a mensagem passada por parâmetro como a label do eixo Y.
plt.xlabel('Ano'): A mesma coisa acontece se utilizarmos o método 'xlabel' para definirmos a label do eixo X, note o prefixo 'x'.
plt.title('Total de crimes x total de fraudes'): Para o titulo usamos o método 'title', passando por parâmetro a string desejada para o titulo.
Agora que adicionamos as legendas, titulo e labels aos eixos, o gráfico passa a ser muito mais compreensível que antes. Alguém que ler seu relatório agora será capaz de compreender a informação principal, contudo, além de ser compreensível, precisa ser visualmente apelativo e bonito, então vamos fazer com que o gráfico não tenha sobras no seu começo e final:
plt.xlim([df['Year'].min(), df['Year'].max()]): O método "xlim" do pyplot usa a mesma lógica do "xlabel" e "ylabel". O prefixo 'x' é utilizado para representar o eixo X. Este método é o responsável por definir o limites da serie impressa em um eixo do plano cartesiano. Como podemos visualizar na previa dos dados, a serie temporal compreende de 1950 ate 2015, estes são os nossos mínimo e máximo e, para recuperarmos essas informações usamos os métodos "min()" e "max()" do pandas que retornam os valores dos extremos de um data frame pandas. Passamos essas 2 informações em forma de tuple para o pyplot via método "xlim".
O resultado final esperado é um gráfico de linhas com titulo, legenda, rótulos nos eixos e totalmente compreensível:
![]() | |
Resultado final do gráfico |
Trabalhando com diferentes tipos de gráficos e salvando em uma imagem
O matplotlib e o pyplot trazem diversas ferramentas para trabalhar com vários tipos de gráficos. Vimos o gráfico de linhas, mas e se quisermos um gráfico de espalhamento/scatter representando o numero de passageiros mensais de companhia aérea fictícia? Esse dataset em questão está disponível no repositório 'pydataset' para o python e R e em vez de apenas mostrar o gráfico dessa vez, vamos salvá-lo em uma imagem:
![]() |
Gerando gráfico do tipo scatter |
import pydataset: Importamos o repositório que contem o dataset de exemplo que iremos usar.
df = pydataset.data('AirPassengers'): Utilizando o método "data" do pydataset para carregar o dataset desejado dentro de um data frame de nome 'df' em nossa aplicação.
plt.scatter(df['time'], df['AirPassengers']): Para gerarmos um gráfico de espalhamento utilizamos o método "scatter", seu funcionamento neste caso é igual ao "plot". Primeiro definimos com o primeiro parâmetro o eixo X e, como segundo parâmetro, definimos o eixo Y.
plt.savefig('plot.png', dpi=300, bbox_inches='tight'): Para salvarmos o nosso gráfico em vez de apenas mostrar ele, usamos o método "savefig", este método salva a atual imagem em que estamos trabalhando. O primeiro parâmetro define o nome do arquivo e seu diretório, caso não seja especificado o caminho completo para o diretório desejado, a imagem será salva no diretório de execução. O segundo parâmetro define a quantidade de dpi para a imagem que vai ser salva, já o ultimo parâmetro serve para definirmos que o gráfico se encaixará no numero de dpi que definimos.
O resultado esperado é um arquivo salvo no diretório de execução(caso feito exatamente como no exemplo), um gráfico de espalhamento:
Fora estes dois exemplos, o matplotlib possui uma gama muito grande de opções e de ferramentas de trabalho. Tudo pode ser encontrado de forma detalhada na documentação do matplotlib e do pyplot, deixarei os links abaixo para consulta.
![]() |
Gráfico de espalhamento |
Boa sorte com seus gráficos.
Fontes, documentações e links úteis
- Pydataset: https://github.com/iamaziz/PyDataset
- Matplotlib: https://matplotlib.org/
- Pyplot: https://matplotlib.org/api/pyplot_api.html
- Python: https://www.python.org/
- Swedish Crime Rates: https://www.kaggle.com/mguzmann/swedishcrime
Comentários
Postar um comentário