Академический Документы
Профессиональный Документы
Культура Документы
FsicaComputacionalFSC5705
Smula Aulas Lista Conc. Freq. Outros Ensino
MatPlotLib
Ao ler este documento provavelmente voc j escutou falar de gnuplot e de xmgrace e deve se perguntar, outro???, sim, outro de entre muitos. decidi escrever sobre esta biblioteca porque a diferencia do xmgrace (que o que eu uso) d para instalar no windows de uma forma relativamente fcil; comparado ao gnuplot ele menos rido no que diz respeita a colocar formulas dentro do grfico; finalmente ele uma faz parte do python, uma plataforma que est em franco crescimento. Se voc usuario windows instalei o pythonxy esse pacote j traz tudo o que voc precisa em python como um estudante de Fsica, se voc se sente bem pagando pois acha que ter a segurana de alguma empresa, de uma olhada em enthought. Se voc usurio mac, o python est no mac e agor s instalar o matplotlib. Finalmente se voc usurio Linux a vida fica mais o menos fcil, usurios de ubuntu (e derivados):
[ u s u a r i o @ p y t h o n : ] # s u d o a p t g e t i n s t a l l p y t h o n m a t p l o t l i b
Grficos Simples
Trabalhar com o matplotlib lembra o gnuplot j que se cimentam numa linguagem de script, mas a diferena que o matplotlib o faz sobre o python, onde se comporta como um outro mdulo mais. Assim a leitura e tratamento de dados (ajustes polinomiais ou no lineares) feito com o Python e no fim mandar a imprimir com o matplotlib.
/media/ext4_evy/Ensino/UFSC/Ano2012/IIsemestre/public_html//matplot.html
1/14
26/10/12
Para executar no Linux voc digita python nome_do_script.py, note que tradicionalmente se coloca .py como extenso dos scripts python.
[ u s u a r i o @ p y t h o n : ] # p y t h o n s c r i p t 0 1 . p y
Figura 01: grfico simples de um conjunto de dados com matplotlib. O resultado desse rodar script o grfico mostrado na figura 01.
Tipo de simbolo
Observe que na linha 15 do script se manda a plotar os dados de representar os pontos, alm de existe outras opes:
No script
. o , v ^ < 1
x
contra
utilizando
para
No grfico
ponto circulo pixel Triangulo para baixo Triangulo para acima Triangulo para esquerda Trpode para baixo
/media/ext4_evy/Ensino/UFSC/Ano2012/IIsemestre/public_html//matplot.html
2/14
26/10/12
2 3 4 s p * h H + x D | Trpode para cima Trpode para esquerda Trpode para direita quadrado pentgono estrela hexgono hexgono rotado mais cruz (x) diamante linha vertical linha horizontal
Tipo de linhas
Em lugar de utilizar pontos, podemos unir os dados utilizando linhas 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 # ! / u s r / b i n / e n v p y t h o n # M o d u l o s p y t h o n i m p o r t n u m p y a s n p i m p o r t s c i p y . i n t e r p o l a t e i m p o r t m a t p l o t l i b a s m p l i m p o r t m a t p l o t l i b . p y p l o t a s p l t # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * # l e o s d a d o s e a r m a z e n a e m 2 v e t o r e s : x , y . x , y = n p . l o a d t x t ( ' d a d o s 0 1 . d a t ' , u n p a c k = T r u e ) # p l o t a n d o o s d a d o s p l t . p l o t ( x , y , ' ' ) p l t . s h o w ( )
?
/media/ext4_evy/Ensino/UFSC/Ano2012/IIsemestre/public_html//matplot.html
3/14
26/10/12
Figura 02: grfico simples de um conjunto de dados com matplotlib. Os tipos de linhas que o matplotlib suporta so
No script
-: -.
No grfico
linha slida linha tracejada linha pontilhada linha trao-ponto
Cor
Para mudar a cor das linhas (smbolos) colocamos entre aspas a cor que desejamos 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 # ! / u s r / b i n / e n v p y t h o n # M o d u l o s p y t h o n i m p o r t n u m p y a s n p i m p o r t s c i p y . i n t e r p o l a t e i m p o r t m a t p l o t l i b a s m p l i m p o r t m a t p l o t l i b . p y p l o t a s p l t # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * # l e o s d a d o s e a r m a z e n a e m 2 v e t o r e s : x , y . x , y = n p . l o a d t x t ( ' d a d o s 0 1 . d a t ' , u n p a c k = T r u e ) # p l o t a n d o o s d a d o s p l t . p l o t ( x , y , ' : ' , c o l o r = ' m ' , m a r k e r = " o " ) p l t . s h o w ( )
?
/media/ext4_evy/Ensino/UFSC/Ano2012/IIsemestre/public_html//matplot.html
4/14
26/10/12
Figura 03: grfico simples mudando a cor dos pontos. As cores disponveis so:
No script
b ou blue c ou cian g ou green k ou black m ou magenta r ou red w ou white y ou yellow
No grfico
azul ciano verde preto magenta vermelho branco amarelo
Alm dessas cores podemos utilizar cores ao estilo das usada em HTML: #d3ddff.
Atributos
No exemplo anterior vimos que a cor da linha foi passada como um atributo, de fato, todos os parmetros que apresentamos at aqui so atributos do grficos que podem ser explicitamente nomeados. O atributos que o matplotlib aceita esto dados na tabela a seguir:
No script
color ou c
No grfico
cor
/media/ext4_evy/Ensino/UFSC/Ano2012/IIsemestre/public_html//matplot.html
5/14
26/10/12
linestyle linewidth marker markeredgecolor markeredgewidth markerfacecolor markersize tipo de linha largura da linha tipo de smbolo
cor de borda do simbolo largura da borda do smbolo cor de recheio do smbolo tamanho de smbolo
Vamos agora a plotar simultaneamente dois conjuntos de dados, utilizaremos a informao da tabela previa para poder identificar cada um das curvas. Para voc testar ter que baixar o arquivo dados02.dat de aqui. 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2
? # ! / u s r / b i n / e n v p y t h o n # M o d u l o s p y t h o n i m p o r t n u m p y a s n p i m p o r t s c i p y . i n t e r p o l a t e i m p o r t m a t p l o t l i b a s m p l i m p o r t m a t p l o t l i b . p y p l o t a s p l t # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * # l e o s d a d o s e a r m a z e n a e m 2 v e t o r e s : x , y . x , y = n p . l o a d t x t ( ' d a d o s 0 1 . d a t ' , u n p a c k = T r u e ) # l e o s I I d a d o s e a r m a z e n a e m 2 v e t o r e s : x , y . x 1 , y 1 = n p . l o a d t x t ( ' d a d o s 0 2 . d a t ' , u n p a c k = T r u e ) # p l o t a n d o o s d a d o s p l t . p l o t ( x , y , l i n e s t y l e = ' ' , c o l o r = ' b l a c k ' , m a r k e r = " o " , m a r k e r s i z e = 2 0 , m a r k e r f a c e c o l o r p l t . p l o t ( x 1 , y 1 , l i n e s t y l e = ' . ' , c o l o r = ' r e d ' , m a r k e r = " o " , m a r k e r s i z e = 1 0 , m a r k e r e d g e c o l o r p l t . s h o w ( )
/media/ext4_evy/Ensino/UFSC/Ano2012/IIsemestre/public_html//matplot.html
6/14
26/10/12
Ttulos, eixos
Agora abordaremos o texto que se coloca no grfico. Na figura script embaixo se mostra como se coloca a legenda nos eixo, o ttulo, e a legenda do prprio grfico 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 # ! / u s r / b i n / e n v p y t h o n # * c o d i n g : u t f 8 * # M o d u l o s p y t h o n i m p o r t n u m p y a s n p i m p o r t s c i p y . i n t e r p o l a t e i m p o r t m a t p l o t l i b a s m p l i m p o r t m a t p l o t l i b . p y p l o t a s p l t # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * # l e o s d a d o s e a r m a z e n a e m 2 v e t o r e s : x , y . x , y = n p . l o a d t x t ( ' d a d o s 0 1 . d a t ' , u n p a c k = T r u e ) # l e o s I I d a d o s e a r m a z e n a e m 2 v e t o r e s : x , y . x 1 , y 1 = n p . l o a d t x t ( ' d a d o s 0 2 . d a t ' , u n p a c k = T r u e ) # p l o t a n d o o s d a d o s p l t . p l o t ( x , y , l i n e s t y l e = ' ' , c o l o r = ' b l a c k ' , m a r k e r = " * " , l a b e l = u " p o s i o " ) p l t . p l o t ( x 1 , y 1 , l i n e s t y l e = ' . ' , c o l o r = ' r e d ' , m a r k e r = " o " , l a b e l = " v e l o c i d a d e " ) p l t . l e g e n d ( l o c = ' u p p e r l e f t ' ) p l t . g r i d ( T r u e ) p l t . x l a b e l ( ' t ( s ) ' ) p l t . y l a b e l ( r ' $ Y ( m ) $ e $ V _ y ( \ f r a c { m } { s } ) $ ' ) p l t . t i t l e ( " E x e m p l o " ) p l t . s h o w ( )
?
/media/ext4_evy/Ensino/UFSC/Ano2012/IIsemestre/public_html//matplot.html
7/14
26/10/12
Figura 04: Legendas no matplotlib. Note que a legenda associada curva colocada via o atributo label. Para que ele aparea no grfico devemos colocar a linha 22 que nesse caso indica que a caixa com legenda dever aparecer no canto superior esquerdo, alm dessa posio temos:
No script
0 ou best 1 ou upper right 2 ou upper left 3 ou lower left 4 ou lower right 5 ou right
No grfico
melhor posio acima e direita acima e esquerda abaixo e esquerda abaixo e direita direita
Note que a tabela diz que podemos utilizar nmeros ou letras (entre aspas) para indicar a posio (loc=10 igual a loc='center'). De fato alm de nmeros podemos utilizar uma tupla de dados (coordenadas) onde por exemplo (0,0) o canto inferior esquerdo e (0.5,0.5) o centro,
/media/ext4_evy/Ensino/UFSC/Ano2012/IIsemestre/public_html//matplot.html
8/14
26/10/12
assim um exemplo de posicionamento seria loc=(0.05,0.8) quase equivalente loc='upper left'. Quando usamos portugus colocamos um u a frente da palavra como feito no label da linha 18 (label=u'posio'), para que isso funcione direito devemos salvar nosso script em UTF-8 e colocar no cabealho # -*- coding: utf-8 -*-. Para a legenda dos eixos x e y se utiliza plt.xlabel('') e plt.ylabel(''), respetivamente. Se voc quer colocar uma equao ou letra grega, por exemplo no eixo x, devemos escrever entre $$ a equao (latex) iniciar com r a legenda, como feito na linha 29 (para maiores informaes de uma olhada em formulas com matplotlib)
/media/ext4_evy/Ensino/UFSC/Ano2012/IIsemestre/public_html//matplot.html
9/14
26/10/12
Figura 05b: Erro nos dados. possvel associar um erro ao pontos nos eixo x (simultaneamente com y, dado um cruz no ponto), para isso utilizamos o parmetro xerr= vetor com dados do erro.
/media/ext4_evy/Ensino/UFSC/Ano2012/IIsemestre/public_html//matplot.html
10/14
26/10/12
3 3 3 4 3 5 3 6
[ u s u a r i o @ p y t h o n : ] # p y t h o n s c r i p t 0 6 . p y c o e f i c i e n t e s d o p o l i n o m i o [ 1 . 0 0 0 0 0 0 0 0 e + 0 0 3 . 9 2 3 5 2 4 4 4 e 1 5 1 . 3 3 0 7 0 5 8 4 e 1 4 ]
P o l i n o m i o a j u s t a d o 2 1 x 3 . 9 2 4 e 1 5 x + 1 . 3 3 1 e 1 4
Figura 06: Ajuste polinomial. A funo polyfit devolve os coeficientes do ajuste polinomial, se esse coeficientes so passados funo poly1d ela vai montar a equao correspondente, como se mostra nas linhas 22 e 23. Com o polinmio criado na linha 22 podemos calcular os novos valores (yajus) como se mostra na linha 26.
Ajuste no linear
Para realizar o ajuste no linear de dados utilizamos a o conjunto de dados aqui armazenados, a esses dados aplicamos o prximo script 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 # ! / u s r / b i n / e n v p y t h o n # * c o d i n g : u t f 8 * # M o d u l o s p y t h o n i m p o r t n u m p y a s n p i m p o r t s c i p y . o p t i m i z e i m p o r t m a t p l o t l i b a s m p l i m p o r t m a t p l o t l i b . p y p l o t a s p l t # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * # F u n o q u e d e s e j a m o s a j u s t a r
?
/media/ext4_evy/Ensino/UFSC/Ano2012/IIsemestre/public_html//matplot.html
11/14
26/10/12
1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2
d e f g a u s i a n a ( x , y o , x o , s ) : y = y o * n p . e x p ( ( x x o ) * * 2 / ( 2 . 0 * s * s ) ) r e t u r n y # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * # l e o s d a d o s e a r m a z e n a e m 2 v e t o r e s : x , y . x , y = n p . l o a d t x t ( ' d a d o s 0 3 . d a t ' , u n p a c k = T r u e ) c h u t e I n i c i a l = n p . a r r a y ( [ 7 . 0 , 1 5 . 0 , 3 . 0 ] ) r e s A j u s t e , m c o v = s c i p y . o p t i m i z e . c u r v e _ f i t ( g a u s i a n a , x , y , p 0 = c h u t e I n i c i a l ) p r i n t " R e s u l t a d o d o a j u s t e : " , r e s A j u s t e p r i n t u ' \ n M a t r i z d e c o v a r i a n a ( d i a g o n a l e h v a r i a n a d o s r e s u l t a d o s ) : ' p r i n t m c o v # g e r a o s y a j u s t a d o s y a j u s = g a u s i a n a ( x , r e s A j u s t e [ 0 ] , r e s A j u s t e [ 1 ] , r e s A j u s t e [ 2 ] ) # c r i a o g r a f i c o p l t . p l o t ( x , y , ' o ' ) p l t . p l o t ( x , y a j u s , ' ' ) p l t . l e g e n d ( [ ' d a d o s ' , ' a j u s t e ' ] , l o c = 2 ) p l t . g r i d ( T r u e ) p l t . x l a b e l ( ' x ' ) p l t . y l a b e l ( ' y ' ) p l t . t i t l e ( u ' E x e m p l o d e a j u s t e n o l i n e a r ' ) p l t . s h o w ( )
[ u s u a r i o @ p y t h o n : ] # p y t h o n s c r i p t 0 7 . p y R e s u l t a d o d o a j u s t e : [ 9 . 6 4 5 1 5 4 4 8 2 0 . 0 3 0 0 9 1 8 8 5 . 1 6 4 7 6 8 0 3 ]
M a t r i z d e c o v a r i a n a ( d i a g o n a l e h v a r i a n a d o s r e s u l t a d o s ) : [ [ 1 . 1 0 1 8 2 1 3 8 e 0 2 4 . 8 7 6 1 7 2 8 2 e 0 5 3 . 9 2 4 0 3 7 1 3 e 0 3 ] [ 4 . 8 7 6 1 7 2 8 2 e 0 5 4 . 2 1 6 8 3 1 6 6 e 0 3 1 . 9 9 8 7 2 2 3 2 e 0 6 ] [ 3 . 9 2 4 0 3 7 1 3 e 0 3 1 . 9 9 8 7 2 2 3 2 e 0 6 4 . 2 0 2 1 0 0 5 0 e 0 3 ] ]
/media/ext4_evy/Ensino/UFSC/Ano2012/IIsemestre/public_html//matplot.html
12/14
26/10/12
Para o ajuste no linear utilizamos a funo scipy.optimize.curve_fit, essa funo espera o nome de outra funo a qual o modelo a ser ajustado ao dados, no programa chamada de gausiana e definida entre as linhas 13 e 15; seguidamente so passado a scipy.optimize.curve_fit os vetores de dados x e y; finalmente damos para ela um chute inicial dos parmetros que definem a funo a ser ajustada. Como resultado do ajuste ela devolve um vetor e uma matriz, o vetor armazena parmetros resultantes do ajuste na ordem que foram definidos na funo, a matriz devolve a matriz de covariana.
Ajuste no linear
Similar ao caso anterior, a diferena que agora a incerteza ser colocada como dado da funo scipy.optimize.curve_fit 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3
? # ! / u s r / b i n / e n v p y t h o n # * c o d i n g : u t f 8 * # M o d u l o s p y t h o n i m p o r t n u m p y a s n p i m p o r t s c i p y . o p t i m i z e i m p o r t m a t p l o t l i b a s m p l i m p o r t m a t p l o t l i b . p y p l o t a s p l t # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * # F u n o q u e d e s e j a m o s a j u s t a r d e f g a u s i a n a ( x , y o , x o , s ) : y = y o * n p . e x p ( ( x x o ) * * 2 / ( 2 . 0 * s * s ) ) r e t u r n y # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * # l e o s d a d o s e a r m a z e n a e m 2 v e t o r e s : x , y . x , y , y e r r = n p . l o a d t x t ( ' d a d o s 0 4 . d a t ' , u n p a c k = T r u e ) c h u t e I n i c i a l = n p . a r r a y ( [ 7 . 0 , 1 5 . 0 , 3 . 0 ] ) r e s A j u s t e , m c o v = s c i p y . o p t i m i z e . c u r v e _ f i t ( g a u s i a n a , x , y , p 0 = c h u t e I n i c i a l , s i g m a = y e r r ) p r i n t " R e s u l t a d o d o a j u s t e : " , r e s A j u s t e p r i n t u ' \ n M a t r i z d e c o v a r i a n a ( d i a g o n a l e h v a r i a n a d o s r e s u l t a d o s ) : ' p r i n t m c o v # g e r a o s y a j u s t a d o s x a j u s = n p . l i n s p a c e ( 0 . 0 , 4 0 . 0 , 1 0 0 ) # g e r a 1 0 0 p o n t o s d e s d e 0 a t 4 0 y a j u s = g a u s i a n a ( x a j u s , r e s A j u s t e [ 0 ] , r e s A j u s t e [ 1 ] , r e s A j u s t e [ 2 ] ) # c r i a o g r a f i c o p l t . e r r o r b a r ( x , y , y e r r , m a r k e r = ' o ' , l i n e s t y l e = ' ' ) p l t . p l o t ( x a j u s , y a j u s , ' ' ) p l t . l e g e n d ( [ ' d a d o s ' , ' a j u s t e ' ] , l o c = 2 ) p l t . g r i d ( T r u e ) p l t . x l a b e l ( ' x ' ) p l t . y l a b e l ( ' y ' ) p l t . t i t l e ( u ' E x e m p l o d e a j u s t e n o l i n e a r ' ) p l t . s h o w ( )
[ u s u a r i o @ p y t h o n : ] # p y t h o n s c r i p t 0 7 . p y R e s u l t a d o d o a j u s t e : [ 9 . 9 4 0 9 5 1 7 5 1 9 . 9 2 3 0 5 9 2 9 4 . 9 9 1 5 3 2 6 4 ]
M a t r i z d e c o v a r i a n a ( d i a g o n a l e h v a r i a n a d o s r e s u l t a d o s ) : [ [ 0 . 0 0 7 7 0 0 0 7 0 . 0 0 1 6 6 5 0 4 0 . 0 0 2 4 4 8 0 7 ] [ 0 . 0 0 1 6 6 5 0 4 0 . 0 0 7 5 0 7 5 4 0 . 0 0 1 0 7 8 5 7 ] [ 0 . 0 0 2 4 4 8 0 7 0 . 0 0 1 0 7 8 5 7 0 . 0 0 5 0 6 7 4 ] ]
/media/ext4_evy/Ensino/UFSC/Ano2012/IIsemestre/public_html//matplot.html
13/14
26/10/12
/media/ext4_evy/Ensino/UFSC/Ano2012/IIsemestre/public_html//matplot.html
14/14