Tutorial Matplotlib
Tutorial Matplotlib
Tutorial Matplotlib
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