Graficos

Graficos são uma forma muito interessante de visualizar informação, é um recurso amplamente utilizado em Data Science, Engenharia, Físcia, etc... Assume-se aqui netes capítulo que o aluno já possui o conhecimento prévio sobre gráficos e o funcionamento dos mesmos.

Por padrão o python não vem equipado com suporte á criação de gráficos, mas por sorte, e pelo esforção de inumeros desenvolvedores, existem várias bibliotecas de apresentação de gráficos para o python.

Neste capítulo iremos utilizar a biblioteca chamada matplotlib. A matplotlib tem suporte a uma gama quantidade de gráficos diferentes. Aqui nesta pagina você pode ver os gráficos que esta poderosa biblioteca possui. Como podemos ver pelo site da bibliteca, a mesma da suporte a muitos tipos de gráficos, e infelismente não temos como ver todos estes gráficos. Entretanto, uma coisa legal do site do matplotlib é que ele possui exemplos de código para cada gráfico, então é muito fácil entender o funcionamento de um gráfico novo.

Se você esta utilizando um ambiente python puro será necessário isntalar o matplotlib, entrentanto se você utiliza o pacotão da anaconda ele já vem incluso =).

Iremos cobrir dois tipos de gráficos aqui neste capítulo: Linhas e pontos.

O primeiro passo para criarmos nossos gráficos é importar o matplotib para nosso script. Para isso é só escrever o seguinte:

In [1]:
import matplotlib.pyplot as plt

Na linha anterior estamos dizendo para o python, importe a bilioteca do matplotlib com o nome plt, desta forma fica mais fácil de chamar os comandos de gráfico. Agora já temos suporte a gŕaficos nos nossos scripts, barbada.

Bom, sempre que queremos trabalhar com gráficos precisaremos de dados, para isso, utilizaremos listas. Se você ainda não sabe utilizar listas confira o capítulo de Listas antes de seguir.

Então vamos criar duas listas, uma contendo notas de alunos, e outra contendo o sexo de cada aluno. Observe que o sexo está representado como 0 e 1.

In [2]:
notas = [10.0, 9.1, 3.2, 6.1, 8.9, 1.2, 0.5]
sexo  = [1,0,0,1,1,0,0]

bacana, agora digamos que queremos visualizar estas notas e o sexo em um gráfico de pontos. Para isso utilizaremos o comando plot.

O comando plot recebe os valores do eixo X e Y do gráfico.

In [3]:
import matplotlib.pyplot as plt

notas = [10.0, 9.1, 3.2, 6.1, 8.9, 1.2, 0.5]
sexo  = [1,0,0,1,1,0,0]

plt.plot(notas, sexo)
Out[3]:
[<matplotlib.lines.Line2D at 0x7f2a585711d0>]

Como voce pode ver o matplotlib não fez nada, o que esta certo, pois nao mandamos o mesmo mostrar o gráfico. Para mostar o gráfico utilizaremos o comando show.

In [4]:
import matplotlib.pyplot as plt

notas = [10.0, 9.1, 3.2, 6.1, 8.9, 1.2, 0.5]
sexo  = [1,0,0,1,1,0,0]

plt.plot(notas, sexo)
plt.show()

Bom... Temos um gráfico. Mas ele esta no formato de linhas, isso é pq o matplotlib assume por padrão que queremos um gráfico de linhas. Mas e se quisermos um gráfico de pontos?

Para mudarmos o gráfico é só passar um "." a mais no plot, isso diz que queremos representar a informação como pontos.

In [5]:
import matplotlib.pyplot as plt

notas = [10.0, 9.1, 3.2, 6.1, 8.9, 1.2, 0.5]
sexo  = [1,0,0,1,1,0,0]

plt.plot(notas, sexo,'.')
plt.show()

bacana né? Agora, já podemos analizar nossa informação utilizando o gráfico. Claramente um dos sexos tira notas melhores que o outro, baseado nesta informação. Mas você concorda que fica ruim de ficar olhando o eixo y para saber qual o sexo do aluno? Não seria melhor mostar cada sexo com cores diferentes?

Bom, podemos trocar a cor dos pontos utilizando a inicial da cor em ingles, por exemplo 'r', indica cor vermelha. Este valor deve ser passado junto com o ponto.

Exemplo

In [6]:
import matplotlib.pyplot as plt

notas = [10.0, 9.1, 3.2, 6.1, 8.9, 1.2, 0.5]
sexo  = [1,0,0,1,1,0,0]

plt.plot(notas, sexo,'r.')
plt.show()

Bom... trocamos a cor para vermelho, mas trocou para ambos os sexos... E agora? Bom, primeiro precisamos entender o que aconteceu. E em resumo, como as informações estão nas mesmas listas vao receber o mesmo tratamento no matplotlib.

Mas então, como eu mudo as cores dos pontos só para um sexo? Simples, separamos em listas diferentes.

Podemos fazer isso manualmente ou utilziando laços de repetição, vamos utilizar laços aqui pq né, é mais interessante e prático.

Exemplo:

In [7]:
import matplotlib.pyplot as plt

notas = [10.0, 9.1, 3.2, 6.1, 8.9, 1.2, 0.5]
sexo  = [1,0,0,1,1,0,0]

nSexo0 = []
nSexo1 = []

sSexo0 = []
sSexo1 = []

for i  in range(0, len(sexo)):
    if sexo[i] == 0:
        nSexo0.append(notas[i])
        sSexo0.append(0)
    else:
        nSexo1.append(notas[i])
        sSexo1.append(1)

        

Pronto, agora temos as notas separadas por sexo, observe que mantivemos uma lista que diz qual é o valor do sexo de cada pessoa, isso é para manter o eixo y com esta escala.

Agora é só mostrar estes dados, o matplotlib permite que sejam dados inúmeros plots antes do gráfico ser mostrado, portanto podemos dar um plot para o sexo0 com uma cor e outro plot com sexo1 com outra.

In [8]:
import matplotlib.pyplot as plt

notas = [10.0, 9.1, 3.2, 6.1, 8.9, 1.2, 0.5]
sexo  = [1,0,0,1,1,0,0]

nSexo0 = []
nSexo1 = []

sSexo0 = []
sSexo1 = []

for i  in range(0, len(sexo)):
    if sexo[i] == 0:
        nSexo0.append(notas[i])
        sSexo0.append(0)
    else:
        nSexo1.append(notas[i])
        sSexo1.append(1)
plt.plot(nSexo0, sSexo0, '.g')
plt.plot(nSexo1, sSexo1, '.r')
plt.show()

E agora podemos ver que cada sexo tem uma cor diferente no gráfico. Neste caso podemos ver que o sexo da cor vermelha vai normalmente melhor que o da cor verde.

Mas este gráfico ainda esta muito simples, podemos melhora-lo colocando um título e indentificação de cada eixo.

Para adicionar um título utilizamos o comando title. E para os eixos os comandos xlabel e ylabel.

In [9]:
import matplotlib.pyplot as plt

notas = [10.0, 9.1, 3.2, 6.1, 8.9, 1.2, 0.5]
sexo  = [1,0,0,1,1,0,0]

nSexo0 = []
nSexo1 = []

sSexo0 = []
sSexo1 = []

for i  in range(0, len(sexo)):
    if sexo[i] == 0:
        nSexo0.append(notas[i])
        sSexo0.append(0)
    else:
        nSexo1.append(notas[i])
        sSexo1.append(1)
        
plt.plot(nSexo0, sSexo0, '.g')
plt.plot(nSexo1, sSexo1, '.r')
plt.xlabel('nota')
plt.ylabel('sexo')
plt.title('Distribuicao de notas por sexo')

plt.show()

Bacana né, agora vamos colocar uma legenda. Para isso é só adicionarmos o comando label em cada plo, o valor de legenda destes dados e a localização da legenda.

Para indicar a localização da legenda utilizamos o comando plt.legend(loc='local da legenda')

Existem inúmeros locais possiveis: 'upper right' : 1, 'upper left' : 2, 'lower left' : 3, 'lower right' : 4, 'right' : 5, 'center left' : 6, 'center right' : 7, 'lower center' : 8, 'upper center' : 9, 'center' : 10,

Exemplo:

In [10]:
import matplotlib.pyplot as plt

notas = [10.0, 9.1, 3.2, 6.1, 8.9, 1.2, 0.5]
sexo  = [1,0,0,1,1,0,0]

nSexo0 = []
nSexo1 = []

sSexo0 = []
sSexo1 = []

for i  in range(0, len(sexo)):
    if sexo[i] == 0:
        nSexo0.append(notas[i])
        sSexo0.append(0)
    else:
        nSexo1.append(notas[i])
        sSexo1.append(1)
        
plt.plot(nSexo0, sSexo0, '.g', label='sexo 0')
plt.plot(nSexo1, sSexo1, '.r', label='sexo 1')
plt.xlabel('nota')
plt.ylabel('sexo')
plt.title('Distribuicao de notas por sexo')
plt.legend(loc='center right')
plt.show()

Bom, já sabemos o básico para gráficos de pontos, agora vamos criar um gráfico de linhas. Digamos que, por exemplo queremos mostar o grafico de uma função, digamos que, a função de coseno. O primeiro passo é termos a informação.

Para facilitar o calculo do coseno vamos utilizar a biblioteca de matematica, esta biblioteca da suporte a inúmeras funções diferentes. Aqui você pode ver todas as funções desta biblioteca: https://docs.python.org/2/library/math.html

Bom, vamos começar criando uma lista com os valores de cosseno. Para isso primeiro importamos o coseno da biblioteca de matematica. E depois criamos uma lista utilizando ele e um laço de repetição.

In [11]:
from math import cos #importamos o cosseno

fCos = [] #lista que vai guardar os valores de cosseno

#vamos gerar 1000 valores de coseno
for i in range(0,1000):
    valor = cos(i*0.1)
    fCos.append(valor)

Agora que temos uma lista com os valores de cosseno, podemos mostrar a mesma em um grafico de linhas. Portanto vamos importar o matplotlib e plotar esta lista.

In [12]:
from math import cos #importamos o cosseno
import matplotlib.pyplot as plt

fCos = [] #lista que vai guardar os valores de cosseno

#vamos gerar 1000 valores de coseno
for i in range(0,1000):
    valor = cos(i*0.1)
    fCos.append(valor)
    
    
plt.plot(fCos)
plt.show()

E temos o gráfico da função cos. Podemos diminuir a frequencia dela aumentando o valor multiplicado em i.

In [13]:
from math import cos #importamos o cosseno
import matplotlib.pyplot as plt

fCos = [] #lista que vai guardar os valores de cosseno

#vamos gerar 1000 valores de coseno
for i in range(0,1000):
    valor = cos(i*0.01)
    fCos.append(valor)
    
    
plt.plot(fCos)
plt.show()

Ou usar o i para aumentar loucamente o valor de y...

In [14]:
from math import cos #importamos o cosseno
import matplotlib.pyplot as plt

fCos = [] #lista que vai guardar os valores de cosseno

#vamos gerar 1000 valores de coseno
for i in range(0,1000):
    valor = cos(i*0.1)*i
    fCos.append(valor)
    
    
plt.plot(fCos)
plt.show()

Podemos mostrar o seno tbm.

In [15]:
from math import cos #importamos o cosseno
from math import sin #importamos o seno

import matplotlib.pyplot as plt

fCos = [] #lista que vai guardar os valores de cosseno
fSin = [] #lista que vai guardar os valores de seno

#vamos gerar 1000 valores de coseno
for i in range(0,1000):
    valorCos = cos(i*0.01)
    valorSin = sin(i*0.01)
    
    fCos.append(valorCos)
    fSin.append(valorSin)
    
    
plt.plot(fCos, 'r')
plt.plot(fSin, 'b') #muda a cor para blue
plt.show()

Como podemos ver, trabalhar com graficos em python é mto simples. Obiviamente vimos apenas o básico do matplotlib, mas existe muito mais que pode ser feito com esta poderosa biblioteca.

In [ ]: