Matplotlib 101

ANOTAÇÃO: em construção. Ainda não decidi se farei uma sequencia de posts “Matplotlib 101” ou se coloco tudo em um texto só. Por enquanto deixo essa versão prévia online.

Tenho observado que a (talvez atualmente extinta) página “matplotlib – histograma (https://umpandanagaragem.wordpress.com/2014/03/09/matplotlib-histograma/)” tem recebido uma quantidade pequena porém consistente de visitas diárias. Essa página foi inicialmente criada como um lembrete apenas, mas parece que tem sido útil de alguma forma, talvez por estar em português, não sei. Então resolvi gastar algumas horas registrando o pouco que sei sobre matplotlib. Talvez deixar aqui o mínimo necessário para fazer gráficos mais simples ajude quem está começando ou quem não quer aprender Python, quer só um jeito rápido de fazer gráficos.

Dois pontos

Vou usar o script abaixo apenas para comentar alguns elementos frequentes da matplotlib.
Matplotlib é uma biblioteca, então possui todo um universo de classes e métodos. Na prática ninguém precisa saber exatamente o que essas coisas são — eu mesmo até hoje não sei dizer direito o que é uma classe, por exemplo –, o que é preciso saber é a matplotlib tem “funções” que permitem fazer praticamente qualquer tipo de gráfico.

#-*- coding: utf-8 -*-

from matplotlib import pyplot, figure

x = [-0.5, 1.5]
y = [0.5, -1.5]

fig = figure.Figure()
ax = pyplot.subplot(111)

pyplot.plot(x, y, marker='o', markerfacecolor='k', linestyle='--', c='r', label='gráfico')

ax.set_title('Dois pontos pretos ligado por linha pontilhada vermelha')
ax.set_xlabel('O eixo x')
ax.set_ylabel('O eixo y')

pyplot.legend()
pyplot.show()

fig01

Quem conhece Python já sabe, mas é bom comentar que na terceira linha eu estou invocando apenas duas dessas “funções”, a pyplot e a figure, que são usadas logo abaixo.
É importante mencionar que a maneira como eu escrevi esse código não é a mais econômica possível. Foi de propósito para deixar claro quem é quem e quem faz o quê.

Antes de fazer comentários sobre o que o código está fazendo é conveniente esclarecer duas coisas:

  1. Em Python as variáveis não exatamente “armazenam” valores, elas são mais como “post-its” como dizia um professor que tive.
    Em C você pega o valor (inteiro, letra, vetor, etc) e joga na variável, como se a variável fosse uma gaveta. Em Python você pega a variável e gruda no objeto (inteiro, letra, lista, etc), como se a variável fosse um post-it.
    Por isso talvez eu diga que “determinada variável está associada a algo”. Porque na prática é isso que acontece, nada é guardado em coisa alguma.
  2. Vou usar o seguinte esquema
    variável = método.função(argumento=valor, argumento=’valor’, argumento=valor)
    Então quando eu mencionar que “a função de determinado método possui três possibilidades de valores para certo argumento” pela cara do código já dá pra ter uma boa visualização de quem é quem.

Então basicamente o código está fazendo o seguinte: primeiro eu defino dois pontos. Cada ponto do plano está associado a um par de valores (x, y); usei as listas **x** e **y** para guardar os valores de x e y de cada ponto. Ou seja, defini dois pontos: (**x**[0], **y**[0]) e (**x**[1], **y**[1]). Por aí já fica claro que se uma lista for maior que a outra vai dar erro, já que cada ponto é definido por um par de valores, um valor de cada lista.

Depois um os métodos invocados (*figure*, com letra minúscula) é usado para criar a tela (através da função *Figure*, com letra maiúscula) onde os gráficos vão ser exibidos, digamos. Essa tela fica associada à variável **fig**.

A variável **ax** está associada à criação de um plano cartesiano, ou, equivalentemente, à criação de um par de eixos. Por isso quando essa função é chamada geralmente o objeto retornado recebe “ax”, de “axes”, “eixos” em inglês.
Nesse caso o método *pyplot* cria um *subplot*, ou seja, um “sub-gráfico”, onde esse *sub* no nome representa a ideia de que você pode criar quantos quiser, no final todos os eixos/sub-gráficos criados através da “pyplot.subplot()” estarão contidas na tela criada por “figure.Figure()” e juntos vão compor um único gráfico.
O significado daqueles números passados como argumentos é meio problemático, já que eu frequentemente me enrolo com eles, mas reza a lenda que seria algo do tipo:

  • 111 -> 1×1, primeiro gráfico
  • 335 -> 3×3, quinto gráfico
  • 243 -> 2×4, terceiro gráfico

Ou seja, o comando *pyplot.subplot(abc)* vai criar o c-ésimo gráfico de uma “grade”, ou “matriz”, com a linhas e b colunas.
Então **ax** é o primeiro gráfico dentre todos os 1 vezes 1 gráficos que eu pretendo adicionar em uma grade/matriz com 1 linha e 1 coluna.

A função *plot* cria gráficos simples de modo que os primeiros dois argumentos sempre serão os valores de x e y e podem ser listas, arrays, funções ou equações matemáticas. Ou seja, a *plot* só cria gráficos onde existe alguma relação entre x e y.
O argumento *marker* define o simbolo de cada ponto. Nesse caso é um círculo, que é o valor padrão. Segue uma lista de alguns dos possíveis valores para esse argumento, lembrando que é possível criar formas do zero:

Marker

  • ‘,’ (pixel)
  • ‘8’ (octógono)’
  • ‘<‘ (triangulo)
  • ‘*’ (estrela)
  • ‘s’ (quadrado),
  • ‘v’ (triângulo)
  • ‘o’ (círculo)
  • ‘^’ (triângulo)
  • ‘.’ (ponto)
  • ‘ ‘ (vazio)
  • ‘h’ (hexágono)
  • ‘x’ (x)
  • ‘+’ (mais)

Antes de comentar sobre os outros argumentos é interessante mencionar que em matplotlib muitos argumentos recebem cores como valores. Existem algumas formas diferentes de indicar cores. Uma é usando letras:

C

  • ‘b’ (azul)
  • ‘g’ (verde)
  • ‘r’ (vermelho)
  • ‘c’ (ciano, famoso “azul claro”)
  • ‘m’ (magenta, famoso “cor-de-rosa”)
  • ‘y’ (amarelo)
  • ‘k’ (preto)
  • ‘w’ (branco)

ou usando os códigos hexadecimais de cada cor, bem conhecidos por quem se aventura com edição de imagem ou desenvolvimento web. Recomendo uma página da W3Schools (http://www.w3schools.com/colors/colors_picker.asp) para conseguir o código da cor desejada.

Dito isso, o argumento *markerfacecolor* vai definir a cor do símbolo definido pelo *marker*.
O argumento *linestyle* tem mesma função do *maker*, definindo neste caso a aparência da linha que une os pontos. Segue algumas das possibilidades

Linestyle

  • ‘-‘ ou ‘solid’ (linha contínua)
  • ‘- -‘ ou ‘dashed’ (linha tracejada)
  • ‘:’ ou ‘dotted’ (linha pontilhada)
  • ‘-.’ ou ‘dash_dot’ (linha tracejada e pontilhada)
  • ‘ ‘ ou ‘None’ (vazio)

O argumento *c* define a cor da linha.
O argumento *label* associa um texto à cada gráfico na legenda que é adicionada por *pyplot.legend()*.

A essa altura deve estar claro que *set_title()*, *set_xlabel()*, *set_ylabel()* definem respectivamente título do sub-gráfico, eixo x e eixo y. Lembrando que é possível criar vários sub-gráficos, então cada um deles possui títulos próprios.

Finalmente *pyplot.show()* abre a janela e exibe o gráfico.

(RASCUNHO SOBRE HISTOGRAMAS)


import matplotlib.pyplot as plt
import numpy as np

dados = [LISTA DE DADOS]
#dados = [float(i) for i in ('''DADOS DE PLANILHA''').split()]
#canais = [INTERVALOS DE VALORES]

plt.hist(dados)
#plt.hist(dados, canais)

plt.title('TITULO DO GRAFICO', fontsize=20)
plt.xlabel('EIXO X', fontsize=20)
plt.ylabel('EIXO Y', fontsize=20)
plt.show()

Esse é um script para construir um histograma simples usando a biblioteca de gráficos do Python, matplotlib. Basicamente existem 3 opções: histogramas originados de lista de dados, histogramas originados de ctrl+c ctrl+v a partir de alguma planilha e o uso de intervalos de dados customizados.

Exemplo 1

hist1


import matplotlib.pyplot as plt
import numpy as np

dados = [58,59,19,95,50,7,26,69,53,30,2,5,44,40,91,16,64,26,61,63,18,26,61,64,75,96,31]
#dados = [float(i) for i in ('''DADOS DE PLANILHA''').split()]
#canais = [INTERVALOS DE VALORES]

plt.hist(dados)
#plt.hist(dados, canais)

plt.title('TITULO DO GRAFICO', fontsize=20)
plt.xlabel('EIXO X', fontsize=20)
plt.ylabel('EIXO Y', fontsize=20)
plt.show()


Exemplo 2

hist2


import matplotlib.pyplot as plt
import numpy as np

dados = [58,59,19,95,50,7,26,69,53,30,2,5,44,40,91,16,64,26,61,63,18,26,61,64,75,96,31]
#dados = [float(i) for i in ('''DADOS DE PLANILHA''').split()]
canais = [0,25,50,75,100]

#plt.hist(dados)
plt.hist(dados, canais)

plt.title('TITULO DO GRAFICO', fontsize=20)
plt.xlabel('EIXO X', fontsize=20)
plt.ylabel('EIXO Y', fontsize=20)
plt.show()


Exemplo 3

hist3


import matplotlib.pyplot as plt
import numpy as np

#dados = [LISTA DE DADOS]
dados = [float(i) for i in ('''
-17.89591
-17.96435
-17.71043
-17.57819
-17.77090
-16.74194
-17.25762
-14.66510
-16.81960
-18.40473
-17.21517
-15.44843
-16.46423
-17.89752
-17.83210
-17.54840
-17.24362
-18.58280
-13.68427
-17.15823
-18.84274
-16.71418
-17.79337
-18.04928
-17.87904
-17.15961
-17.59052
-15.83752
-18.70539
-14.42371
-19.63679
-17.88515
-17.65372
-15.91635
-15.89963
-15.99960
-18.91731
-17.52039
-18.23755
-17.93645
-17.39266
-18.79326
-18.18732
-18.39912
-17.99109
-17.50984
-17.46164
-16.51260
-16.50172
-19.03774
-18.59307
-18.15489
-18.93821
-18.05813
-18.67828
-18.58286
-17.20923
-18.65162
-18.60208
-17.39514
-18.63336
-16.58332
-16.76180
-18.85155
-17.19089
-17.39168
-18.09889
-17.13380
-18.16789
-16.15502
-16.44382
-18.56816
-15.72842
-17.60848
-17.00959
-19.14632
-15.39709
-20.00086
-12.98933
-16.05238
-19.36177
-13.57497
-16.94540
-17.72276
-17.71171
-16.57040
-17.48272
-18.00701
-17.11477
-18.80201
-16.49740
-17.57425
-15.76723
-18.05816
-18.84091
-18.34606
-14.80033
-17.35876
-15.49905
-16.59897
-17.04827
-19.15057
-16.57681
-18.53973
-17.55646
-16.72860
-16.72012
-18.67512
-17.49793
-17.69381
-17.54865
-17.09152
-17.44696
-16.58297
-17.22869
-16.87341
-18.00540
-16.17306
-17.52284
-15.13523
-17.41943
-16.19994
-17.06180
-15.31871
-17.31839
-17.48376
-17.00918
-16.79870
-18.41742
-18.15930
-16.23562
-18.14622
-17.31307
-14.25819
-16.89161
-13.72418
-17.39511
-16.67755
-16.91446
-14.06130
-17.13939
-15.39914
-14.26426
-18.03291
-18.03994
-17.20970
-17.13166
-17.71211
-18.19124
-18.12314
-18.22269
-18.37547
-17.99801
-18.52735
-17.04639
-18.28191
-18.03049
-17.21262
-16.66184
-16.19896
-16.65412
-17.24646
-16.95173
-16.75177
-16.47660
-17.77057
-17.64500
-16.57850
-17.89519
-17.56594
-17.31278
-15.92599
-16.48151
-15.47840
-15.46911
-16.46958
-15.02302
-16.62848
-15.69961
-17.62695
-15.82911
-16.62242
-17.49318
-16.71448
-16.15638
-15.48700
-17.16664
-17.91054
-16.41584
-16.52568
-17.36554
-17.10803
-17.88092
-16.70505
-16.80789
-18.40364
-16.13264
-18.86091
-18.68998
-17.45443
-17.58748
-17.46677
-16.41842
-17.98525
-17.86074
-16.82569
-15.85352
-17.22757
-16.00780
-17.22133
-17.61592
-18.61333
-19.04835
-18.85644
-19.49945
-17.00040
-18.94363
-17.50047
-17.81754
-18.03052
-17.80926
-19.11977
-18.18279
-15.83252
-17.91210
-19.13096
-17.82328
-17.87164
-16.42170
-17.49192
-16.97953
-16.46029
-17.38215
-18.68937
-17.86700
-18.87868
-16.92920
-17.09304
-16.12646
-17.79517
-18.48862
-18.10566
-17.69136
-17.33157
-16.34284
-16.09153
-18.62527
-16.75543
-19.09887
-17.45457
-18.82052
-17.43096
-16.30846
-18.84010
-17.74056
-16.89892
-18.38972
-16.18002
-16.39323
-16.84012
-17.54775
-15.84117
-16.72167
-17.85088
-17.06657
-16.48718
-17.65088
-17.06352
-17.27741
-18.05103
-15.44954
-17.33088
-14.45200
-16.26624
-15.82707
-14.70464
-13.94124
-15.36978
-14.72093
-17.75745
-17.35925
-14.87870
-17.47281
-15.34489
-15.50984
-16.73624
-14.79023
-14.77053
-15.89650
-16.52498
-12.71076
-16.28988
-17.40722
-16.32414
-16.60122
-16.61569
-16.60821
-18.13141
-17.75295
-15.05962
-18.02252
-16.07030
-16.80443
-16.13366
-16.63738
-16.52082
-15.26062
-17.20104
-17.45163
-17.53478
-16.17928
-18.45692
-17.89008
-17.61243
-16.48863
-17.87090
-16.45865
-17.21862
-17.01872
-17.54575
-18.00770
-16.39458
-18.07055
-16.44150
-18.02685
-18.25093
-18.40078
-17.21997
-16.82486
-17.60450
-18.98417
-17.48714
-17.45017
-18.61127
-16.84629
-16.71881
-18.63258
-17.24877
-17.75355
-18.13128
-18.57432
-19.04065
-18.39791
-16.37086
-18.77918
-17.92818
-18.90119
-17.00188
-18.42266
-18.59516
-18.17299
-18.47663
-17.61719
-17.40168
-18.41472
-18.55834
-18.57983
-18.51722
-18.71995
-18.40013
-18.20787
-18.21332
-17.36249
-18.26795
-18.68281
-17.25904
-18.05553
-18.04339
-18.37119
-18.45203
-17.86722
-17.15844
-17.86752
-17.50439
-17.02624
-15.67443
-15.68067
-17.45970
-16.39958
-17.78589
-18.67212
-17.95794
-17.79283
-17.89181
-18.15722
-17.32450
-17.67594
-18.39624
-17.11134
-17.09472
-15.28244
-18.48650
-17.72070
-16.93543
-17.22813
-16.82711
-18.09840
-17.27958
-18.61353
-18.15590
-17.18140
-17.39164
-14.53126
-18.17320
-17.82476
-17.70611
-17.36468
-16.92226
-18.94265
-17.21285
-18.17041
-18.74938
-18.16805
-17.15565
-16.13281
-16.13992
-16.35602
-16.64066
-15.56169
-15.54065
-18.19404
-17.74979
-18.02137
-17.75546
-17.06576
-18.66361
-18.29316
-17.52974
-18.48996
-15.79993
-18.27424
-17.46921
-17.94842
-18.57120
-18.40815
-18.21252
-16.91122
-16.86455
-18.53523
-16.82388
-17.50989
-17.67385
-17.79317
-17.89591
-17.50031
-16.03347
-18.48463
-17.90092
-18.21076
-18.40730
-17.37189
-17.86593
-17.97576
-17.50539
-18.08359
-18.30175
-17.07316
-18.51552
-16.20945
-16.32071
-16.71082
-15.79871
-16.34981
-15.76992
-14.28321
-15.01742
-18.25710
-16.99247
-17.83670
-17.61733
-16.46539
-17.28530
-17.22797
-16.36199
-16.03919
-16.87439
-16.28121
-15.96494
-16.99633
-16.61240
-17.01100
-17.31026
-17.91983
-15.83455
-14.90953
-18.07721
-17.61384
-17.22194
-17.78560
-17.22482
-18.58632
-16.48789
-16.20595
-17.38844
-16.51566
-17.10952
-17.86573
-17.59007
-17.16846
-17.55873
-18.73153
-17.32988
-17.43404
-17.30668
-16.16190
-17.30499
-17.74687
-16.40849
-14.93046
-17.56111
-17.21150
-18.12229
-17.02653
-16.63162
-16.56272
-16.89695
-17.78475
-15.51288
-17.82150
-17.69444
-17.62848
-19.30514
-19.26243
-17.51645
-17.33086
-16.31875
-17.45498
-18.41138
-17.63865
-16.71946
-17.46055
-16.81908
-17.16096
-17.98655
-16.77252
-15.61519
-17.59492
-16.92174
-16.52802
-19.15764
-16.48749
-18.94145
-17.52309
-19.25642
-18.45310
-17.84980
-17.61139
-18.39690
-19.27827
-18.71394
-16.76081
-15.82492
-18.29953
-16.94661
-17.11439
-18.18278
-17.29683
-17.13063
-18.40424
-17.74933
-18.61205
-16.11020
-18.97075
-18.41371
-17.13107
-15.93858
-17.42188
-17.89521
-16.11835
-18.58360
-18.64963
-18.00438
-16.92761
-17.37355
-17.97877
-17.88252
-17.13338
-18.56569
-17.35376
-17.89129
-16.25025
-16.22612
-17.02007
-18.68386
-16.62669
-16.34718
-16.93439
-17.90734
-17.70882
-16.00122
-15.97133
-18.49328
-18.39227
-17.07086
-17.16245
-18.79331
-16.65285
-15.21336
-18.17787
-16.92252
-18.11339
-17.08102
-16.76512
-18.62057
-18.35071
-17.59382
-18.28061
-17.86806
-17.55807
-16.02536
-17.32037
-16.78127
-17.65378
-17.98845
-17.96979
-18.14321
-18.28741
-18.12766
-19.06995
-18.77096
-19.07167
-18.54371
-15.71581
-17.45829
-18.61867
-18.72127
-18.52808
-18.56569
-17.91129
-15.64154
-18.34234
-17.40503
-18.58699
-16.83725
-16.07389
-18.73734
-16.14065
-17.77803
-17.47586
-14.63399
-18.68145
-17.42079
-17.36618
-17.66277
-18.86229
-16.71076
-16.64864
-17.15549
-19.02244
-17.56474
-18.78231
-17.45133
-18.43112
-15.35183
-18.56146
-15.89498
-16.42830
-17.97275
-16.41118
-18.68141
-16.75570
-18.28580
-16.35345
-17.31992
-16.40132
-18.77905
-17.51893
-18.82011
-17.23394
-17.86459
-16.63528
-19.05929
-17.77067
-17.62876
-16.41539
-17.77998
-16.25080
-16.86083
-18.43423
-17.94513
-18.42545
-16.23751
-15.38798
-17.80848
-16.95632
-15.00968
-18.20996
-17.95863
-17.54057
-17.61289
-17.54206
-17.47267
-18.85970
-18.02920
-17.41750
-17.39728
-16.57338
-18.12421
-17.62446
-16.49380
-16.00620
-16.52691
-16.37924
-16.25195
-17.09307
-13.93620
-18.27276
-18.03883
-15.12961
-17.27794
-17.61435
-17.30181
-16.92421
-18.53909
-17.36269
-17.85840
-17.73655
-18.11189
-17.70259
-18.39963
-14.31756
-17.03938
-17.80451
-18.53331
-16.37808
-18.81560
-17.23290
-17.51442
-18.41302
-17.76976
-17.20910
-17.13107
-18.72798
-15.87973
-15.67964
-16.36915
-17.15465
-17.73350
-19.29690
-17.07182
-15.99366
-18.07869
-17.40085
-18.02264
-15.21124
-18.07560
-16.35320
-17.61015
-17.55110
-16.45131
-18.79993
-18.22959
-18.03211
-16.44724
-18.09514
-18.52788
-18.33959
-17.63320
-17.90646
-17.20515
-17.78624
-16.20876
-18.83605
-18.42835
-18.44987
-18.62911
-18.08187
-18.54220
-18.57900
-17.99585
-17.19134
-18.10808
-18.33280
-17.92901
-18.08310
-16.16426
-18.39086
-18.50674
-15.62583
-17.57039
-17.96928
-18.61132
-18.36084
-16.82568
-16.36964
-18.98236
-16.61435
-17.14795
-17.16019
-15.71872
-17.73103
-18.19609
-17.59667
-15.75659
-15.03122
-17.25434
-18.54094
-17.04130
-17.28754
-16.94643
-17.06648
-17.29135
-15.46707
-17.56825
-17.05733
-18.06022
-17.86067
-17.50807
-16.38178
-18.27369
-18.39566
-17.97708
-17.62728
-16.10574
-18.57865
-16.33632
-16.32755
-18.50677
-15.75373
-15.48276
-18.48364
-16.50802
-16.81620
-15.01718
-13.22736
-15.32977
-12.14335
-17.53613
-17.79284
-17.54702
-18.28897
-19.08697
-18.65736
-17.75415
-18.06729
-16.62143
-18.49505
-18.56316
-17.53046
-17.61227
-18.01798
-18.78190
-18.88100
-19.26099
-17.11396
-18.57714
-16.13773
-18.54634
-16.60010
-17.77692
-17.56399
-14.49722
-15.81748
-14.02322
-14.03869
-18.00580
-17.91917
-16.53203
-16.60316
-17.03508
-15.13463
-16.80784
-16.87484
-18.03385
-17.16360
-16.15893
-17.77590
-18.64525
-17.14017
-17.02596
-18.46362
-16.73660
-18.24249
-13.31344
-16.36839
-15.74292
-17.55487
-16.70633
-16.71072
-17.70444
-17.27461
-18.29172
-17.49315
-16.37335
-18.21830
-17.72939
-19.02528
-18.07649
-18.72175
-16.81419
-17.85864
-17.93869
''').split()]
#canais = [INTERVALOS DE VALORES]

plt.hist(dados)
#plt.hist(dados, canais)

plt.title('TITULO DO GRAFICO', fontsize=20)
plt.xlabel('EIXO X', fontsize=20)
plt.ylabel('EIXO Y', fontsize=20)
plt.show()

Anúncios

Comentário:

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s