28.04.2013 Views

Tutorial Matplotlib

Tutorial Matplotlib

Tutorial Matplotlib

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

numist - IST<br />

<strong>Tutorial</strong> para estudantes<br />

Construir bom material de apresentação para teses e trabalhos em engenharia<br />

Pedro Correia<br />

2011


ÍNDICE<br />

INTRODUÇÃO ................................................................................................................................ 3<br />

INSTALAR O PYTHON ..................................................................................................................... 3<br />

FICHEIROS DE TEXTO ..................................................................................................................... 5<br />

PREPARAR A CONSOLA E FOLHA DE SCRIPT .................................................................................. 5<br />

CARREGAR FICHEIROS DE DADOS PARA O PYTHON ..................................................................... 6<br />

HISTOGRAMAS .............................................................................................................................. 7<br />

RESUMO DOS HISTOGRAMAS ................................................................................................. 14<br />

GRÁFICOS DE LINHAS E PONTOS ................................................................................................. 15<br />

RESUMO DOS GRÁFICOS DE PONTOS E LINHAS ......................................................................... 19<br />

CONSIDERAÇÕES FINAS ............................................................................................................... 20<br />

2


INTRODUÇÃO<br />

Recentemente reparei na dificuldade dos estudantes em apresentarem os seus resultados em<br />

teses ou trabalhos académicos devido ao desconhecimento que têm dos softwares usados<br />

vulgarmente na construção dos mesmos. Regra geral programas como o EXCEL (Office) e CALC<br />

(Open Office) são os mais utilizados para essas funções e embora proporcionem a maneira<br />

mais óbvia para o utilizador analisar os seus dados pecam por não permitir, ou ser complexo,<br />

construir gráficos com o detalhe e caracterização ideal para um resultado. Por esse motivo<br />

construo este guia para qualquer pessoa que queira produzir material visual de qualidade nos<br />

seus trabalhos.<br />

Para o fazer irei utilizar a linguagem Python. Isto não é uma introdução à programação, coisa<br />

que o utilizador deve ter em conta (existe outra publicação no numist que, de facto, ensina a<br />

programar em Python), mas sim um guia de instruções para cumprir objectivos muito<br />

específicos. Para isso irei ensinar o utilizador a carregar dados para dentro do Python e analisálos<br />

visualmente e, por vezes, numericamente.<br />

INSTALAR O PYTHON<br />

O pacote que aconselho a que se instale é o Python XY (penso que de momento só existe<br />

versão para Windows). Está disponível para download gratuito no seguinte link (secção de<br />

downloads):<br />

http://www.pythonxy.com/<br />

3


As bibliotecas que estão lá dentro que vão mesmo precisar é o numpy e o matplotlib, mas é<br />

minha sugestão que, se vão instalar o pacote o façam com tudo o que está lá dentro. Quando<br />

surgir na janela de instalação a lista de pacotes que têm de instalar procurem que pelos menos<br />

os que indiquei acima estejam seleccionados.<br />

Agora, depois de instalarem deverá aparecer um ícone do Python XY algures no desktop. Ao<br />

carregarem nele (ou então vão à procura dele na lista de programas no inciar) irá aparecer isto:<br />

Ao carregarem no sítio que eu estou, declaradamente, a dizer para carregarem vai aparecer<br />

isto (ou semelhante, eu já tenho código lá, vocês não vão ter):<br />

4<br />

Carreguem aqui.


Ao que está dentro do rectângulo vermelho na imagem que mostrei vamos chamar consola.<br />

Ao que está dentro do rectângulo verde vamos chamar folha de script.<br />

FICHEIROS DE TEXTO<br />

Regra geral nós costumamos meter todas as informações em ficheiros de texto (é possível<br />

exportar as tabelas de EXCEL e CALC para ficheiros de texto no “Salvar como…”). Um ficheiro<br />

de texto, regra geral com extensão .txt, .prn, etc… (.doc e .docx não são ficheiros de texto, são<br />

ficheiros do Word) e podem ser abertos com programas como o notepad, no Windows, e gedit,<br />

no Ubuntu. Para ser mais simples para vocês aprenderem façam os vossos ficheiros de texto<br />

com os dados lá dentro assim:<br />

10<br />

20<br />

15<br />

14<br />

23<br />

33<br />

29<br />

19<br />

10<br />

9<br />

No caso de terem apenas uma coluna de dados, e assim no caso de terem duas:<br />

13 27<br />

9 33<br />

10 29<br />

7 37<br />

9 31<br />

8 39<br />

5 44<br />

3 33<br />

2 42<br />

1 55<br />

E por ai adiante no caso de terem 3, 4 ou mais. Reparem que não há mais informação<br />

nenhuma nos ficheiros sem ser os vossos dados.<br />

PREPARAR A CONSOLA E FOLHA DE SCRIPT<br />

Quando começarem a trabalhar na consola ou folha de script façam estes comandos antes de<br />

fazer seja o que for:<br />

5


Para a consola:<br />

In [1]: from __future__ import division<br />

In [2]: import numpy as np<br />

In [3]: import matplotlib.pyplot as plt<br />

Para a folha de script:<br />

from __future__ import division<br />

import numpy as np<br />

import matplotlib.pyplot as plt<br />

Com isto vocês estão a importar as bibliotecas necessárias para fazer gráficos e outras coisas.<br />

Sempre que iniciarem uma sessão (abrirem o software ou uma folha de script nova), escrevam<br />

isto se já não estiver lá escrito.<br />

CARREGAR FICHEIROS DE DADOS PARA O PYTHON<br />

Para carregar ficheiros para o Python como aqueles que mostrei num dos capítulos anteriores<br />

basta fazer assim (no meu exemplo estou a abrir o exemplo que dei de ficheiro com duas<br />

colunas):<br />

In [4]: dados=np.loadtxt(r'C:\Pedro Correia\Dados\TESES E TRABALHOS\DADOS\nome_do_vosso_ficheiro.txt')<br />

dados=np.loadtxt(r'C:\Pedro Correia\Dados\TESES E TRABALHOS\DADOS\nome_do_vosso_ficheiro.txt')<br />

Reparem que meti o caminho onde está o ficheiro conjuntamente com o nome dentro de<br />

pelicas. Reparem que também está um “r” antes das pelicas. É importante para o Python<br />

perceber que é um caminho escrito à moda do Windows por isso se estiverem a trabalhar em<br />

Windows metam-no sempre. Agora já têm dos dados carregados. Se chamarem na consola a<br />

variável “dados” para onde foi para a informação que meteram no ficheiro vai aparecer toda a<br />

informação:<br />

6


In [5]: dados<br />

Out[5]:<br />

array([[ 13., 27.],<br />

[ 9., 33.],<br />

[ 10., 29.],<br />

[ 7., 37.],<br />

[ 9., 31.],<br />

[ 8., 39.],<br />

[ 5., 44.],<br />

[ 3., 33.],<br />

[ 2., 42.],<br />

[ 1., 55.]])<br />

A folha de script vai correr apenas quando a fizeres correr (depois explico) enquanto a consola<br />

funciona em tempo real. Por isso é que só mostrei como fazer na consola (na folha de script<br />

seria totalmente inútil).<br />

HISTOGRAMAS<br />

Histogramas são dos tipos de gráficos mais usados por descreverem o que é a distribuição de<br />

uma variável. Mas antes de fazermos um histograma vamos ver como seleccionamos apenas<br />

uma das colunas dos nossos dados (para escolhermos apenas uma variável). Se assumirmos<br />

que os dados estão dispostos desta maneira:<br />

Linhas\Colunas 0 1<br />

0 13 27<br />

1 9 33<br />

2 10 29<br />

3 7 37<br />

4 9 31<br />

5 8 39<br />

6 5 44<br />

7 3 33<br />

8 2 42<br />

9 1 55<br />

Então a primeira coluna é a coluna 0 e a segunda a coluna 1, da mesma maneira que a primeira<br />

linha é a linha 0 e a segunda a 1, terceira a 2, por ai adiante. É assim que se escolhe as posições<br />

em Python. Para escolher posições em python fazemos assim (exemplo apenas na consola):<br />

In [6]: dados[3,0]<br />

Out[6]: 7.0<br />

7


Repara que escolhi o número que estava na posição 3 das linhas e 0 das colunas (confirma na<br />

tabela). Se eu quiser escolher uma coluna inteira em vez de apenas uma posição digo que<br />

quero tudo numa determinada linha ou coluna com o indicador “:”.<br />

In [7]: dados[:,0]<br />

Out[7]: array([ 13., 9., 10., 7., 9., 8., 5., 3., 2., 1.])<br />

Repara que escolhi todas a linhas da coluna 0. Vamos lá agora fazer um histograma desta<br />

coluna.<br />

In [8]: plt.hist(dados[:,0])<br />

Out[8]:<br />

(array([2, 1, 0, 1, 0, 2, 2, 1, 0, 1]),<br />

array([ 1. , 2.2, 3.4, 4.6, 5.8, 7. , 8.2, 9.4, 10.6,<br />

11.8, 13. ]),<br />

)<br />

plt.hist(dados[:,0])<br />

plt.show()<br />

Resultou o histograma acima mostrado. Têm classes a mais por isso vou especificar que apenas<br />

quero três classes no histograma.<br />

In [9]: plt.hist(dados[:,0],bins=3)<br />

Out[9]:<br />

(array([3, 3, 4]),<br />

array([ 1., 5., 9., 13.]),<br />

)<br />

plt.hist(dados[:,0],bins=3)<br />

plt.show()<br />

8


Pretendo visualizar os histogramas de ambas as colunas no mesmo gráfico. Para isso insiro as<br />

instruções seguintes:<br />

In [10]: plt.hist(dados[:,0],bins=5)<br />

Out[10]:<br />

(array([3, 1, 2, 3, 1]),<br />

array([ 1. , 3.4, 5.8, 8.2, 10.6, 13. ]),<br />

)<br />

In [11]: plt.hist(dados[:,1],bins=5)<br />

Out[11]:<br />

(array([3, 3, 2, 1, 1]),<br />

array([ 27. , 32.6, 38.2, 43.8, 49.4, 55. ]),<br />

)<br />

plt.hist(dados[:,0],bins=5)<br />

plt.hist(dados[:,1],bins=5)<br />

plt.show()<br />

9


Ele mudou a cor automaticamente quando reparou que havia dois sets de dados dentro do<br />

mesmo gráfico. Repara também que mudei o número de classes para 5 em cada histograma.<br />

Quero agora comparar o histograma da primeira coluna (0) com 3 classes e com 5 classes no<br />

mesmo gráfico. Para isso quero meter o primeiro caso a azul e o segundo a vermelho.<br />

In [12]: plt.hist(dados[:,0],bins=3,color='blue')<br />

Out[12]:<br />

(array([3, 3, 4]),<br />

array([ 1., 5., 9., 13.]),<br />

)<br />

In [13]: plt.hist(dados[:,0],bins=5,color='red')<br />

Out[13]:<br />

(array([3, 1, 2, 3, 1]),<br />

array([ 1. , 3.4, 5.8, 8.2, 10.6, 13. ]),<br />

)<br />

plt.hist(dados[:,0],bins=3,color=’blue’)<br />

plt.hist(dados[:,0],bins=5,color=’red’)<br />

plt.show()<br />

O problema neste caso é que o histograma vermelho está a ocultar o azul de certa maneira por<br />

isso seria ideal que ele apresentasse alguma transparência para o que está por baixo parecer<br />

perceptível.<br />

In [14]: plt.hist(dados[:,0],bins=3,color='blue')<br />

Out[14]:<br />

(array([3, 3, 4]),<br />

array([ 1., 5., 9., 13.]),<br />

)<br />

In [15]: plt.hist(dados[:,0],bins=5,color='red',alpha=0.5)<br />

Out[15]:<br />

(array([3, 1, 2, 3, 1]),<br />

array([ 1. , 3.4, 5.8, 8.2, 10.6, 13. ]),<br />

)<br />

plt.hist(dados[:,0],bins=3,color=’blue’)<br />

plt.hist(dados[:,0],bins=5,color=’red’,alpha=0.5)<br />

plt.show()<br />

10


Agora todas as características do primeiro histograma com o segundo são perceptíveis ao<br />

leitor e por estarem os dois incluídos no mesmo gráfico torna-se muito fácil de comparar.<br />

Reparem que nos gráficos acima o Python automaticamente estabelece um espaço em branco<br />

para cada um dos lados do histograma e por vezes nós próprios queremos controlar onde<br />

começa e acaba o limite da imagem. Podemos fazê-lo assim:<br />

In [16]: plt.hist(dados[:,0],bins=3,color='blue')<br />

Out[16]:<br />

(array([3, 3, 4]),<br />

array([ 1., 5., 9., 13.]),<br />

)<br />

In [17]: plt.hist(dados[:,0],bins=5,color='red',alpha=0.5)<br />

Out[17]:<br />

(array([3, 1, 2, 3, 1]),<br />

array([ 1. , 3.4, 5.8, 8.2, 10.6, 13. ]),<br />

)<br />

In [18]: plt.xlim(1,13)<br />

Out[18]: (4, 10)<br />

In [19]: plt.ylim(0.5,4)<br />

Out[19]: (1, 3)<br />

plt.hist(dados[:,0],bins=3,color=’blue’)<br />

plt.hist(dados[:,0],bins=5,color=’red’,alpha=0.5)<br />

plt.xlim(1,13)<br />

plt.ylim(0.5,4)<br />

plt.show()<br />

11


Até agora não fizemos nada de muito impressionante mas já conseguimos fazer alterações<br />

pequenas aos nossos gráficos. O resultado na folha de script é o seguinte no meu exemplo<br />

(repara que para correr o script é preciso fazer “run”):<br />

Isto irá fazer aparecer a janela do gráfico por onde vocês podem salvar para imagem.<br />

12


Uma coisa que me estava a esquecer é de acrescentar legenda ao gráfico. É muito fácil, basta<br />

acrescentar a label em cada instrução e depois meter o comando legend. Aqui está um código<br />

completo feito no script:<br />

from __future__ import division<br />

import numpy as np<br />

import matplotlib.pyplot as plt<br />

dados=np.loadtxt(r'C:\Pedro Correia\Dados\TESES E<br />

TRABALHOS\DADOS\nome_do_vosso_ficheiro.txt')<br />

plt.hist(dados[:,0],bins=3,color='blue',label='3 classes')<br />

plt.hist(dados[:,0],bins=5,color='red',alpha=0.5, label='4 classes')<br />

plt.legend()<br />

plt.xlim(1,13)<br />

plt.ylim(0.5,4.5)<br />

plt.show()<br />

13


RESUMO DOS HISTOGRAMAS<br />

Cabeçalho inicial:<br />

from __future__ import division<br />

import numpy as np<br />

import matplotlib.pyplot as plt<br />

Importar dados:<br />

dados=np.loadtxt(r'C:\Pedro Correia\Dados\TESES E TRABALHOS\DADOS\nome_do_vosso_ficheiro.txt')<br />

Fazer o histograma à primeira coluna especificando o número de classes (bins), cor (color) e<br />

transparência da cor (alpha) e nome (label):<br />

plt.hist(dados[:,0],bins=5,color=’red’,alpha=0.5, label=’5 classes’)<br />

Limitar a imagem dos gráficos aos limites em X e Y:<br />

plt.xlim(1,13)<br />

plt.ylim(0.5,4)<br />

Acrescentar legenda:<br />

plt.legend()<br />

Visualizar o gráfico (na consola não é preciso):<br />

plt.show()<br />

A título de informação o parâmetro alpha vai de 0 a 1, com zero sendo totalmente<br />

transparente e 1 sendo totalmente opaco (sem transparência). Só utilizamos as cores azul<br />

(blue) e vermelho (red) mas é possível meter qualquer cor lá desde que indicando ou o nome<br />

da cor ou o código da cor. Algumas das cores possível com nome são:<br />

blue, red, green, yellow, orange, purple, violet, pink, black, grey,brown,sienna,etc.<br />

14


GRÁFICOS DE LINHAS E PONTOS<br />

Gráficos de linhas e de pontos são feitos com o mesmo comando no matplotlib simplesmente<br />

mudamos o estilo do marcador (linha, pontos, triângulos, estrelas, tracejado, o que tu<br />

quiseres…). Então pegando nos dados que já usamos no capítulo anterior fazemos (a partir de<br />

agora mostrarei apenas o código para a folha de script pois como já deverás ter percebido a<br />

única diferença entre um e outro é o facto de funcionarem por compilação ou em tempo real):<br />

from __future__ import division<br />

import numpy as np<br />

import matplotlib.pyplot as plt<br />

dados=np.loadtxt(r'C:\Pedro Correia\Dados\TESES E<br />

TRABALHOS\DADOS\nome_do_vosso_ficheiro.txt')<br />

plt.plot(dados[:,0],dados[:,1],marker='-',color='orange',label='scatterplot')<br />

plt.legend()<br />

plt.show()<br />

Repara que por ter metido no campo do “marker” o símbolo ‘-‘ (hífen) o gráfico saiu com<br />

linhas. Se tivesse metido outro símbolo com por exemplo o ‘o’ (letra o) surgiriam bolas como o<br />

marcador (repara nas duas alternativas e o que acontece com os resultados):<br />

plt.plot(dados[:,0],dados[:,1],marker='o',color='orange',label='scatterplot')<br />

plt.legend()<br />

plt.show()<br />

plt.plot(dados[:,0],dados[:,1],'o',color='orange',label='scatterplot')<br />

plt.legend()<br />

plt.show()<br />

15


Um saiu com linhas e pontos e outro só com pontos. Podemos achar que o marcador dos<br />

pontos é demasiado pequeno e podemos muda-lo com o comando “markersize”:<br />

plt.plot(dados[:,0],dados[:,1],marker='o',markersize=30,color='orange',label='scatterplot')<br />

plt.legend()<br />

plt.show()<br />

Da mesma maneira que limitamos a janela nos gráficos do capítulo anterior também podemos<br />

continuar a fazê-lo com os comandos “xlim” e “ylim”. Como já deverás ter reparado também a<br />

legenda funciona da mesma maneira. Informação nova é adicionar nomes aos eixos e título ao<br />

gráfico.<br />

plt.plot(dados[:,0],dados[:,1],marker='o',markersize=30,color='orange',label='scatterplot')<br />

plt.xlabel('Data Set 1')<br />

plt.ylabel('Data Set 2')<br />

plt.title('Relacao entre Set 1 e Set 2')<br />

plt.legend()<br />

plt.show()<br />

16


Claro que o tamanho das letras poderá ser demasiado pequeno por defeito por isso para o<br />

caso de o queres mudar basta indicares, com o comando “fontsize”, o tamanho que pretendes:<br />

plt.plot(dados[:,0],dados[:,1],marker='o',markersize=30,color='orange',label='scatterplot')<br />

plt.xlabel('Data Set 1', fontsize=30)<br />

plt.ylabel('Data Set 2', fontsize=30)<br />

plt.title('Relacao entre Set 1 e Set 2', fontsize=30)<br />

plt.legend()<br />

plt.show()<br />

Da mesma maneira que podes mudar o tamanho podes também mudar uma série de outros<br />

parâmetros como se queres o texto em “bold”, “itálico”, a fonte do texto, entre muitas outras<br />

17


coisas. No exemplo a seguir mostro os comandos “fontstyle” (itálico ou não), “fontweight”<br />

(texto em bold, muito ou pouco…) e “family” (tipo de letra).<br />

plt.plot(dados[:,0],dados[:,1],marker='o',markersize=30,color='orange',label='scatterplot')<br />

plt.xlabel('Data Set 1',fontsize=30,fontstyle='italic',fontweight='light',family='monospace')<br />

plt.ylabel('Data Set 2',fontsize=30,fontstyle='oblique',family='fantasy')<br />

plt.title('Relacao entre Set 1 e Set 2',fontsize=40,fontstyle='normal',fontweight='bold')<br />

plt.legend()<br />

plt.show()<br />

Existem muitos comandos para muitas coisas no matplotlib e nesta publicação não se<br />

pretende passar por todos (nem pouco mais ou menos). No entanto, certamente, cada vez que<br />

quiseres fazer qualquer coisa mais específica podes ir procurar à net que não demorarás muito<br />

a encontrar.<br />

18


RESUMO DOS GRÁFICOS DE PONTOS E LINHAS<br />

Para fazeres um gráfico de linhas:<br />

dados=np.loadtxt(r'C:\Pedro Correia\Dados\TESES E<br />

TRABALHOS\DADOS\nome_do_vosso_ficheiro.txt')<br />

plt.plot(dados[:,0],dados[:,1],marker='-',color='orange',label='scatterplot')<br />

plt.legend()<br />

plt.show()<br />

Para fazeres um gráfico de pontos:<br />

plt.plot(dados[:,0],dados[:,1],marker='o',color='orange',label='scatterplot')<br />

Outros tipos de marcadores que podem usar são (dão todo o tipo de forma, é uma questão de<br />

experimentar:<br />

Para mudar o tamanho do marcador:<br />

Para dar nomes aos eixos e título:<br />

Para mudar tamanhos, estilos e tipos de fonte:<br />

‘o’,’-‘,’--',’^’,’>’,’


CONSIDERAÇÕES FINAS<br />

Obviamente que para tirar total proveito do matplotlib é preciso saber Python como deve ser.<br />

Existe uma publicação disponível no numist para isso em (está publicação também passa pela<br />

matplotlib):<br />

http://numist.ist.utl.pt/index.php?action=media;sa=item;in=15<br />

De qualquer das maneiras para fazer gráficos simples as instruções que vos dei nos capítulos<br />

anteriores servem perfeitamente. Se quiserem continuar a trabalhar no matplolib para além<br />

do que aprenderam aqui podem tirar ideias da galeria que eles têm no site deles:<br />

http://matplotlib.sourceforge.net/gallery.html<br />

Se carregarem nas imagens vão dar ao código que deu origem aquela imagem. Alguns<br />

exemplos do que se pode fazer estão nas imagens seguintes:<br />

O software SciPlot (que nunca chegou a ser terminado) foi largamente baseado nesta<br />

biblioteca para fazer os seus gráficos e existe uma versão para download gratuito do mesmo<br />

no numist no link:<br />

http://numist.ist.utl.pt/index.php?action=media;sa=item;in=11<br />

De resto espero que esta pequena sebenta sirva para melhorar em muito a publicação de<br />

trabalhos e teses no mundo dos estudantes (e profissionais também) que há para ai.<br />

Grande abraço,<br />

Pedro Correia<br />

20

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!