• Nenhum resultado encontrado

Tutorial Para Estudantes Com o Matplotlib

N/A
N/A
Protected

Academic year: 2021

Share "Tutorial Para Estudantes Com o Matplotlib"

Copied!
20
0
0

Texto

(1)

numist - IST numist - IST

Tutorial para estudantes

Tutorial para estudantes

Construir bom material de apresentação para teses e

Construir bom material de apresentação para teses e trabalhos em engenhariatrabalhos em engenharia

Pedro Correia Pedro Correia 2011

(2)

ÍNDICE

ÍNDICE

INTRODUÇÃO

INTRODUÇÃO ... 3... 3 INSTALAR

INSTALAR O O PYTHON PYTHON ... 3... 3 FICHEIROS

FICHEIROS DE TEXTO ...DE TEXTO ... 5... 5 PREPARAR

PREPARAR A CONSOLA A CONSOLA E FOLHA E FOLHA DE SCRIPT DE SCRIPT ... 5... 5 CARREGAR FICHEIROS DE DADOS

CARREGAR FICHEIROS DE DADOS PARA O PYTHON ... 6PARA O PYTHON ... 6 HISTOGRAMAS

HISTOGRAMAS ... 7... 7 RESUMO DOS

RESUMO DOS HISTOGRAMAS ...HISTOGRAMAS ... 14... 14 GRÁFICOS

GRÁFICOS DE LINHAS DE LINHAS E PONTOS ...E PONTOS ... 15... 15 RESUMO DOS GRÁFICOS DE

RESUMO DOS GRÁFICOS DE PONTOS E LINHAS PONTOS E LINHAS ... 19... 19 CONSIDERAÇÕES

(3)

INTRODUÇÃO

Recentemente reparei na dificuldade dos estudantes em apresentarem os seus resultados em teses ou trabalhos académicos devido ao desconhecimento que têm dos softwares usados vulgarmente na construção dos mesmos. Regra geral programas como o EXCEL (Office) e CALC (Open Office) são os mais utilizados para essas funções e embora proporcionem a maneira mais óbvia para o utilizador analisar os seus dados pecam por não permitir, ou ser complexo, construir gráficos com o detalhe e caracterização ideal para um resultado. Por esse motivo construo este guia para qualquer pessoa que queira produzir material visual de qualidade nos seus trabalhos.

Para o fazer irei utilizar a linguagem Python. Isto não é uma introdução à programação, coisa que o utilizador deve ter em conta (existe outra publicação no numist que, de facto, ensina a programar em Python), mas sim um guia de instruções para cumprir objectivos muito específicos. Para isso irei ensinar o utilizador a carregar dados para dentro do Python e analisá-los visualmente e, por vezes, numericamente.

INSTALAR O PYTHON

O pacote que aconselho a que se instale é o Python XY (penso que de momento só existe versão para Windows). Está disponível para download gratuito no seguinte link (secção de downloads):

(4)

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

minha sugestão que, se vão instalar o pacote o façam com tudo o que está lá dentro. Quando surgir na janela de instalação a lista de pacotes que têm de instalar procurem que pelos menos os que indiquei acima estejam seleccionados.

Agora, depois de instalarem deverá aparecer um ícone do Python XY algures no desktop. Ao carregarem nele (ou então vão à procura dele na lista de programas no inciar) irá aparecer isto:

Ao carregarem no sítio que eu estou, declaradamente, a dizer para carregarem vai aparecer isto (ou semelhante, eu já tenho código lá, vocês não vão ter):

(5)

Ao que está dentro do rectângulo vermelho na imagem que mostrei vamos chamar consola. Ao que está dentro do rectângulo verde vamos chamar folha de script.

FICHEIROS DE TEXTO

Regra geral nós costumamos meter todas as informações em ficheiros de texto (é possível exportar as tabelas de EXCEL e CALC para ficheiros de texto no “Salvar como…”). Um ficheiro de texto, regra geral com extensão .txt, .prn, etc… (.doc e .docx não são ficheiros de texto, são ficheiros do Word) e podem ser abertos com programas como o notepad, no Windows, e gedit, no Ubuntu. Para ser mais simples para vocês aprenderem façam os vossos ficheiros de texto com os dados lá dentro assim:

10 20 15 14 23 33 29 19 10 9

No caso de terem apenas uma coluna de dados, e assim no caso de terem duas:

13 27 9 33 10 29 7 37 9 31 8 39 5 44 3 33 2 42 1 55

E por ai adiante no caso de terem 3, 4 ou mais. Reparem que não há mais informação nenhuma nos ficheiros sem ser os vossos dados.

PREPARAR A CONSOLA E FOLHA DE SCRIPT

Quando começarem a trabalhar na consola ou folha de script façam estes comandos antes de fazer seja o que for:

(6)

Para a consola:

Para a folha de script:

Com isto vocês estão a importar as bibliotecas necessárias para fazer gráficos e outras coisas. Sempre que iniciarem uma sessão (abrirem o software ou uma folha de script nova), escrevam isto se já não estiver lá escrito.

CARREGAR FICHEIROS DE DADOS PARA O PYTHON

Para carregar ficheiros para o Python como aqueles que mostrei num dos capítulos anteriores basta fazer assim (no meu exemplo estou a abrir o exemplo que dei de ficheiro com duas colunas):

Reparem que meti o caminho onde está o ficheiro conjuntamente com o nome dentro de pelicas. Reparem que também está um “r” antes das pelicas. É importante para o Python perceber que é um caminho escrito à moda do Windows por isso se estiverem a trabalhar em Windows metam-no sempre. Agora já têm dos dados carregados. Se chamarem na consola a variável “dados” para onde foi para a informação que meteram no ficheiro vai aparece r toda a informação:

In [1]: from __future__ import division In [2]: import numpy as np

In [3]: import matplotlib.pyplot as plt

from __future__ import division import numpy as np

import matplotlib.pyplot as plt

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

(7)

A folha de script vai correr apenas quando a fizeres correr (depois explico) enquanto a consola funciona em tempo real. Por isso é que só mostrei como fazer na consola (na folha de script seria totalmente inútil).

HISTOGRAMAS

Histogramas são dos tipos de gráficos mais usados por descreverem o que é a distribuição de uma variável. Mas antes de fazermos um histograma vamos ver como seleccionamos apenas uma das colunas dos nossos dados (para escolhermos apenas uma variável). Se assumirmos que os dados estão dispostos desta maneira:

Linhas\Colunas 0 1 0 13 27 1 9 33 2 10 29 3 7 37 4 9 31 5 8 39 6 5 44 7 3 33 8 2 42 9 1 55

Então a primeira coluna é a coluna 0 e a segunda a coluna 1, da mesma maneira que a primeira linha é a linha 0 e a segunda a 1, terceira a 2, por ai adiante. É assim que se escolhe as posições em Python. Para escolher posições em python fazemos assim (exemplo apenas na consola):

In [5]: dados Out[5]: array([[ 13., 27.], [ 9., 33.], [ 10., 29.], [ 7., 37.], [ 9., 31.], [ 8., 39.], [ 5., 44.], [ 3., 33.], [ 2., 42.], [ 1., 55.]]) In [6]: dados[3,0] Out[6]: 7.0

(8)

Repara que escolhi o número que estava na posição 3 das linhas e 0 das colunas (confirma na tabela). Se eu quiser escolher uma coluna inteira em vez de apenas uma posição digo que quero tudo numa determinada linha ou coluna com o indicador “:”.

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

Resultou o histograma acima mostrado. Têm classes a mais por isso vou especificar que apenas quero três classes no histograma.

In [7]: dados[:,0] Out[7]: array([ 13., 9., 10., 7., 9., 8., 5., 3., 2., 1.]) In [8]: plt.hist(dados[:,0]) Out[8]: (array([2, 1, 0, 1, 0, 2, 2, 1, 0, 1]), array([ 1. , 2.2, 3.4, 4.6, 5.8, 7. , 8.2, 9.4, 10.6, 11.8, 13. ]),

<a list of 10 Patch objects>)

plt.hist(dados[:,0]) plt.show() In [9]: plt.hist(dados[:,0],bins=3) Out[9]: (array([3, 3, 4]), array([ 1., 5., 9., 13.]), <a list of 3 Patch objects>) plt.hist(dados[:,0],bins=3) plt.show()

(9)

Pretendo visualizar os histogramas de ambas as colunas no mesmo gráfico. Para isso insiro as instruções seguintes: In [10]: plt.hist(dados[:,0],bins=5) Out[10]: (array([3, 1, 2, 3, 1]), array([ 1. , 3.4, 5.8, 8.2, 10.6, 13. ]), <a list of 5 Patch objects>)

In [11]: plt.hist(dados[:,1],bins=5) Out[11]:

(array([3, 3, 2, 1, 1]),

array([ 27. , 32.6, 38.2, 43.8, 49.4, 55. ]), <a list of 5 Patch objects>)

plt.hist(dados[:,0],bins=5) plt.hist(dados[:,1],bins=5) plt.show()

(10)

Ele mudou a cor automaticamente quando reparou que havia dois sets de dados dentro do mesmo gráfico. Repara também que mudei o número de classes para 5 em cada histograma. Quero agora comparar o histograma da primeira coluna (0) com 3 classes e com 5 classes no mesmo gráfico. Para isso quero meter o primeiro caso a azul e o segundo a vermelho.

O problema neste caso é que o histograma vermelho está a ocultar o azul de certa maneira por isso seria ideal que ele apresentasse alguma transparência para o que está por baixo parecer perceptível.

In [12]: plt.hist(dados[:,0],bins=3,color='blue') Out[12]:

(array([3, 3, 4]),

array([ 1., 5., 9., 13.]), <a list of 3 Patch objects>)

In [13]: plt.hist(dados[:,0],bins=5,color='red') Out[13]:

(array([3, 1, 2, 3, 1]),

array([ 1. , 3.4, 5.8, 8.2, 10.6, 13. ]), <a list of 5 Patch objects>)

plt.hist(dados[:,0],bins=3,color= ’blue’) plt.hist(dados[:,0],bins=5,color= ’red’) plt.show() In [14]: plt.hist(dados[:,0],bins=3,color='blue') Out[14]: (array([3, 3, 4]), array([ 1., 5., 9., 13.]), <a list of 3 Patch objects>)

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

(array([3, 1, 2, 3, 1]),

array([ 1. , 3.4, 5.8, 8.2, 10.6, 13. ]), <a list of 5 Patch objects>)

(11)

Agora todas as características do primeiro histograma com o segundo são perceptíveis ao leitor e por estarem os dois incluídos no mesmo gráfico torna-se muito fácil de comparar. Reparem que nos gráficos acima o Python automaticamente estabelece um espaço em branco para cada um dos lados do histograma e por vezes nós próprios queremos controlar onde começa e acaba o limite da imagem. Podemos fazê-lo assim:

In [16]: plt.hist(dados[:,0],bins=3,color='blue') Out[16]:

(array([3, 3, 4]),

array([ 1., 5., 9., 13.]), <a list of 3 Patch objects>)

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

(array([3, 1, 2, 3, 1]),

array([ 1. , 3.4, 5.8, 8.2, 10.6, 13. ]), <a list of 5 Patch objects>)

In [18]: plt.xlim(1,13) Out[18]: (4, 10)

In [19]: plt.ylim(0.5,4) Out[19]: (1, 3)

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

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

plt.xlim(1,13) plt.ylim(0.5,4) plt.show()

(12)

Até agora não fizemos nada de muito impressionante mas já conseguimos fazer alterações pequenas aos nossos gráficos. O resultado na folha de script é o seguinte no meu exemplo (repara que para correr o script é preciso fazer “run”):

(13)

Uma coisa que me estava a esquecer é de acrescentar legenda ao gráfico. É muito fácil, basta acrescentar a label em cada instrução e depois meter o comando legend. Aqui está um código completo feito no script:

from __future__ import division import numpy as np

import matplotlib.pyplot as plt

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

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

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

plt.xlim(1,13) plt.ylim(0.5,4.5) plt.show()

(14)

RESUMO DOS HISTOGRAMAS

Cabeçalho inicial:

Importar dados:

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

transparência da cor (alpha) e nome (label):

Limitar a imagem dos gráficos aos limites em X e Y:

Acrescentar legenda:

Visualizar o gráfico (na consola não é preciso):

A título de informação o parâmetro alpha vai de 0 a 1, com zero sendo totalmente transparente e 1 sendo totalmente opaco (sem transparência). Só utilizamos as cores azul (blue) e vermelho (red) mas é possível meter qualquer cor lá desde que indicando ou o nome da cor ou o código da cor. Algumas das cores possível com nome são:

from __future__ import division import numpy as np

import matplotlib.pyplot as plt

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

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

plt.xlim(1,13) lt. lim 0.5,4

plt.show() plt.legend()

(15)

GRÁFICOS DE LINHAS E PONTOS

Gráficos de linhas e de pontos são feitos com o mesmo comando no matplotlib simplesmente mudamos o estilo do marcador (linha, pontos, triângulos, estrelas, tracejado, o que tu quiseres…). Então pegando nos dados que já usamos no capítulo anterior fazemos (a partir de agora mostrarei apenas o código para a folha de script pois como já deverás ter percebido a única diferença entre um e outro é o facto de funcionarem por compilação ou em tempo real):

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

linhas. Se tivesse metido outro símbolo com por exemplo o ‘o’ (letra o) surgiriam bolas como o marcador (repara nas duas alternativas e o que acontece com os resultados):

from __future__ import division import numpy as np

import matplotlib.pyplot as plt

dados=np.loadtxt( r'C:\Pedro Correia\Dados\TESES E TRABALHOS\DADOS\nome_do_vosso_ficheiro.txt' ) plt.plot(dados[:,0],dados[:,1],marker= '-',color='orange',label='scatterplot') plt.legend() plt.show() plt.plot(dados[:,0],dados[:,1],marker= 'o',color='orange',label='scatterplot') plt.legend() plt.show() plt.plot(dados[:,0],dados[:,1], 'o',color='orange',label='scatterplot')

(16)

Um saiu com linhas e pontos e outro só com pontos. Podemos achar que o marcador dos pontos é demasiado pequeno e podemos muda-lo com o comando “markersize”:

Da mesma maneira que limitamos a janela nos gráficos do capítulo anterior também podemos continuar a fazê-lo com os comandos “ xlim” e “ylim”. Como já deverás ter reparado também a

legenda funciona da mesma maneira. Informação nova é adicionar nomes aos eixos e título ao gráfico. plt.plot(dados[:,0],dados[:,1],marker= 'o',markersize=30,color='orange',label='scatterplot') plt.legend() plt.show() plt.plot(dados[:,0],dados[:,1],marker= 'o',markersize=30,color='orange',label='scatterplot') plt.xlabel('Data Set 1') plt.ylabel('Data Set 2')

plt.title( 'Relacao entre Set 1 e Set 2' ) plt.legend()

(17)

Claro que o tamanho das letras poderá ser demasiado pequeno por defeito por isso para o caso de o queres mudar basta indicares, com o comando “ fontsize”, o tamanho que pretendes:

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

plt.plot(dados[:,0],dados[:,1],marker= 'o',markersize=30,color='orange',label='scatterplot') plt.xlabel('Data Set 1', fontsize=30)

plt.ylabel('Data Set 2', fontsize=30)

plt.title( 'Relacao entre Set 1 e Set 2' , fontsize=30) plt.legend()

(18)

coisas. No exemplo a seguir mostro os comandos “fontstyle”  (itálico ou não), “fontweight” (texto em bold, muito ou pouco…) e “family” (tipo de letra).

Existem muitos comandos para muitas coisas no matplotlib e nesta publicação não se pretende passar por todos (nem pouco mais ou menos). No entanto, certamente, cada vez que quiseres fazer qualquer coisa mais específica podes ir procurar à net que não demorarás muito a encontrar.

plt.plot(dados[:,0],dados[:,1],marker= 'o',markersize=30,color='orange',label='scatterplot') plt.xlabel('Data Set 1',fontsize=30,fontstyle='italic',fontweight= 'light',family='monospace') plt.ylabel('Data Set 2',fontsize=30,fontstyle='oblique',family='fantasy')

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

(19)

RESUMO DOS GRÁFICOS DE PONTOS E LINHAS

Para fazeres um gráfico de linhas:

Para fazeres um gráfico de pontos:

Outros tipos de marcadores que podem usar são (dão todo o tipo de forma, é uma questão de experimentar:

‘o’,’-‘,’--',’^’,’>’,’<’,’v’,’*’,’+’,’.’,’p’,’s’,’h’

Para mudar o tamanho do marcador:

Para dar nomes aos eixos e título:

Para mudar tamanhos, estilos e tipos de fonte:

dados=np.loadtxt( r'C:\Pedro Correia\Dados\TESES E TRABALHOS\DADOS\nome_do_vosso_ficheiro.txt' ) plt.plot(dados[:,0],dados[:,1],marker= '-',color='orange',label='scatterplot') plt.legend() plt.show() plt.plot(dados[:,0],dados[:,1],marker= 'o',color='orange',label='scatterplot') plt.plot(dados[:,0],dados[:,1],marker= 'o',markersize=30,color='orange',label='scatterplot') plt.plot(dados[:,0],dados[:,1],marker= 'o',markersize=30,color='orange',label='scatterplot') plt.xlabel( 'Data Set 1')

plt.ylabel( 'Data Set 2')

plt.title( 'Relacao entre Set 1 e Set 2' ) plt.legend()

plt.show()

plt.plot(dados[:,0],dados[:,1],marker= 'o',markersize=30,color='orange',label='scatterplot') plt.xlabel( 'Data Set 1',fontsize=30,fontstyle= 'italic' ,fontweight= 'light',family='monospace') plt.ylabel( 'Data Set 2',fontsize=30,fontstyle= 'oblique',family='fantasy')

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

(20)

CONSIDERAÇÕES FINAS

Obviamente que para tirar total proveito do matplotlib é preciso saber Python como deve ser. Existe uma publicação disponível no numist para isso em (está publicação também passa pela matplotlib):

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

De qualquer das maneiras para fazer gráficos simples as instruções que vos dei nos capítulos anteriores servem perfeitamente. Se quiserem continuar a trabalhar no matplolib para além do que aprenderam aqui podem tirar ideias da galeria que eles têm no site deles:

http://matplotlib.sourceforge.net/gallery.html

Se carregarem nas imagens vão dar ao código que deu origem aquela imagem. Alguns exemplos do que se pode fazer estão nas imagens seguintes:

O software SciPlot (que nunca chegou a ser terminado) foi largamente baseado nesta biblioteca para fazer os seus gráficos e existe uma versão para download gratuito do mesmo no numist no link:

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

De resto espero que esta pequena sebenta sirva para melhorar em muito a publicação de trabalhos e teses no mundo dos estudantes (e profissionais também) que há para ai.

Grande abraço, Pedro Correia

Referências

Documentos relacionados

Por vezes, o localizador necessita de alterar não só o texto como também possíveis imagens ou a forma como estas são apresentadas, sendo o exemplo mais óbvio o caso de

NÃO havendo lance(s) no LOTE 02, os bens móveis serão divididos por segmentos/categorias conforme detalhamento a saber: LOTE 03 – Bens Móveis pertencentes a CATEGORIA AUDIO

Vale destacar, ainda, que, apesar de a ação de Saturnino de Brito em Passo Fundo ser mencionada pela historiografia especializada, não se dispõem de estudos aprofundados na

A seleção portuguesa feminina de andebol de sub-20 perdeu hoje 21-20 com a Hungria, na terceira jornada do Grupo C do Mundial da categoria, a decorrer em Koprivnica, na

Desta forma, a docência, inserida neste contexto, é apontada por Vasconcelos (1997) como uma das profissões de alto risco pela Organização Internacional do Trabalho (OIT)

Neste trabalho avaliamos as respostas de duas espécies de aranhas errantes do gênero Ctenus às pistas químicas de presas e predadores e ao tipo de solo (arenoso ou

Dessa forma, os níveis de pressão sonora equivalente dos gabinetes dos professores, para o período diurno, para a condição de medição – portas e janelas abertas e equipamentos

17 CORTE IDH. Caso Castañeda Gutman vs.. restrição ao lançamento de uma candidatura a cargo político pode demandar o enfrentamento de temas de ordem histórica, social e política