domingo, 10 de maio de 2020

Controlando as marcações do gráfico

Controlando as marcações do gráfico

Em todos os gráfico que fizemos até agora é possível notar algumas pequenas marcações nos eixos x e y. Essas marcações podem ter diversas funções, isso dependo do seu objetivo. É possível que em algum momento você precise alterar esse espaçamento. Até esse momento deixamos a biblioteca matplotlib definir o espaçamento entre essas marcações. Nesse tutorial vamos aprender como modificar esses espaçamentos.

Como alterar as marcações do eixo x

No exemplo abaixo vamos alterar o espaço entre as marcações do eixo x:

Exemplo
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

x = np.linspace(-15, 15, 1024)
y = np.sinc(x)
ax = plt.axes()

ax.xaxis.set_major_locator(ticker.MultipleLocator(5))
ax.xaxis.set_minor_locator(ticker.MultipleLocator(1))

plt.plot(x, y, c = 'k')
plt.show()

Executando o exemplo acima o resultado deve ser um gráfico igual a este:

Como funciona…

Nesse exemplo definimos que a biblioteca matplotlib deve adicionar cinco marcações para cinco pontos mais impostantes do gráfico. E uma para cada marcação de menor importância. Para fazer isso criamos uma instância do objeto axes (Esse objeto controla os eixos do gráfico) e depois definimos uma instância para os marcadores de maior importância e os com menos importância.

Mais formas com Matplotlib

Mais formas com Matplotlib

No tutorial anterior usamos formas já definidas da biblioteca matplotlib. Em muitas situações apenas essas forma não serão suficientes para suprir as suas necessidades. Por isso que a biblioteca matplotlib nos permite criar formas completamente novas. Podemos criar essas novas formas usando polígonos. E é o que vamos aprender nesse tutorial.

Polígonos

Polígonos são figuras geométricas planas e fechadas formadas por segmentos de reta. Essas retas são formadas por pontos interligados. Veja como trabalhar com polígonos com matplotlib:

Exemplo
import numpy as np
import matplotlib.patches as patches
import matplotlib.pyplot as plt

heptagono = np.linspace(0, 2 * np.pi, 8)
pontos = np.vstack((np.cos(heptagono), np.sin(heptagono))).transpose()

plt.gca().add_patch(patches.Polygon(pontos, color = '.75'))
plt.grid(True)
plt.axis('scaled')
plt.show()

Executando o código acima você deve ter um gráfico com um heptágono igual a este:

Como funciona…

O método patches.Polygon recebe uma matriz com as coordenadas de cada ponto do polígono.

Tem mais…

Todas as formas possuem os atributos que já estudamos antes, como o estilo da linha, largura e cor. Veja um exemplo abaixo:

Exemplo
import numpy as np
import matplotlib.patches as patches
import matplotlib.pyplot as plt

heptagono = np.linspace(0, 2 * np.pi, 6)
pontos = np.vstack((np.cos(heptagono), np.sin(heptagono))).transpose()
plt.gca().add_patch(plt.Circle((0, 0), radius = 1., color = '.75'))
plt.gca().add_patch(plt.Polygon(pontos, closed = None, fill = None,
lw = 3., ls = 'dotted', edgecolor = 'k'))

plt.grid(True)
plt.axis('scaled')
plt.show()

Executando o código acima você deve ter um gráfico igual a este:

Como funciona…

Nesse exemplo criamos um polígono dentro de um circulo. No polígono tem dois parâmetros que devemos prestar atenção. São eles o fill e ls. Passando o valor none para o parâmetro fill definimos que o polígono não terá preenchimento. E com o parâmetro ls definimos o tipo da borda, no caso definimos que a borda será pontilhada.

Adicionando formas ao gráfico

Adicionando formas ao gráfico

Em algumas situações precisamos adicionar formas ao gráfico. Essas formas podem ser usadas para criar figuras, como um logo de uma marca ou uma silhueta de um animal. Com a biblioteca matplotlib podemos criar formas a partir de primitivas, como as linhas que aprendemos a criar no tutorial anterior. Nesse tutorial vamos aprender a adicionar formas ao nosso gráfico.

Como criar formas com matplotlib

Com esse código vamos criar algumas formas geométricas simples, e a partir desse exemplo você será capais de criar diversas formas mais complexas:

Exemplo
import matplotlib.patches as patches
import matplotlib.pyplot as plt

cor = (0., .40, 1.)

# Circulo
forma = patches.Circle((0, 0), radius = 1., color = cor)
plt.gca().add_patch(forma)

# Retângulo
forma = patches.Rectangle((2.5, -.5), 2., 1., color = cor)
plt.gca().add_patch(forma)

# Elipse
forma = patches.Ellipse((0, -2.), 2., 1., color = cor)
plt.gca().add_patch(forma)

# caixa
forma = patches.FancyBboxPatch((2.5, -2.5), 2., 1., boxstyle = 'sawtooth', color = cor)
plt.gca().add_patch(forma)

plt.grid(True)
plt.axis('scaled')
plt.show()

Executando o código acima o gráfico deve apresentar quatro figuras igual a essas:

Como funciona…

Cada forma no gráfico foi criado com um método diferente. Dependendo da forma que se deseja criar um método especifico deve ser chamado com os parâmetros corretos. Por exemplo, para criar um circulo só precisamos passar dois parâmetros e para criar uma caixa precisamos passar quatro. Veja os parâmetros usados em cada método:
Circle: o método circle precisa de dois argumentos para desenhar um circulo. O primeiro parâmetro é uma tupla com as coordenadas do centro do circulo e o segundo é o raio do circulo.
Rectangle: o método Rectangle precisa de três argumentos. O primeiro é uma tupla com as coordenadas do canto superior esquerdo do retângulo. O segundo parâmetro é a largura do retângulo. E por fim, o terceiro define a altura do retângulo.
Ellipse: o método Ellipse recebe o mesmo número de parâmetros que o método Rectangle: uma tupla com as coordenas (diferente do método Rectangle, essas coordenadas são do centro da elipse), a largura da elipse e a altura. O método Ellipse também tem o parâmetro ‘angle’. Esse parâmetro define o ângulo de inclinação da elipse.
FancyBboxPatch: o método FancyBboxPatch cria um retângulo com as bordas personalizadas. Esse método recebe quatro parâmetros: as coordenadas do canto inferior esquerdo, a largura, a altura e o estilo das bordas do retângulo, respectivamente.
O parâmetro boxstyle pode receber os seguintes valores: 'larrow' , 'rarrow' , 'round' , 'round4' , 'roundtooth' , 'sawtooth' , ou 'square'.

Adicionando linhas com Matplotlib

Adicionando linhas com Matplotlib

Até agora utilizamos elementos prontos da biblioteca matplotlib como os pontos, as curvas e os diagramas de caixa. Com esses elementos podemos representar muitos valores, mais não todos. É possível que em algum momento você precise de um elemento extra. Talvez um elemento simples, como a linha. Nesse tutorial vamos aprender a criar linhas com a biblioteca matplotlib.

Como criar linhas

Nesse exemplo vamos criar algumas linhas independentes:

Exemplo
import matplotlib.pyplot as plt

n_linhas = 16
for i in range(n_linhas):
  plt.gca().add_line(plt.Line2D((0, i), (n_linhas - i, 0)))

plt.grid(True)
plt.axis('scaled')
plt.show()

Executando código acima o gráfico apresentado deve ser igual a este:

Como funciona o método Line2D

Com esse código criamos 16 linhas independentes. O método tem dois parâmetros obrigatórios. Esses parâmetros são as coordenadas do início da linha e do fim. Note que cada parâmetro é uma tupla com as coordenadas x e y. O método Line2D também aceitas outros parâmetros que já estudamos em tutoriais anteriores, como é o caso do estilo, largura, e cor da linha.
O método Line2D cria um objeto Line2D mas não renderiza, isso é feito com o método plt.gca().add_line().
Utilizamos o método axis para garantir que o gráfico fique com uma figura uniforme.

Adicionando um grid ao gráfico com Matplotlib

Adicionando um grid ao gráfico com Matplotlib

Em algumas situações é um pouco complicado descobrir as coordenadas exatas de um ponto no gráfico apenas olhando. O que você consegue é apenas um número ligeiramente próximo. Adicionando grid ao gráfico esse problema pode ser minimizado. Com um grid o gráfico vai ficar cheio de linhas na vertical e horizontal. Assim facilitando a obtenção de coordenadas mais precisas apenas olhando o gráfico.

Como adicionar um grid ao gráfico

A biblioteca matplotlib fornece a função grid para adicionarmos um grid ao gráfico. Com essa função é só passar o valor True e o gráfico será renderizado com uma grade.

Exemplo
import numpy as np
import matplotlib.pyplot as plt

X = np.linspace(-4, 4, 1024)
Y = .25 * (X + 4.) * (X + 1.) * (X - 2.)

plt.plot(X, Y, c = (.40, 1.0, .21))
plt.grid(True)
plt.show()

Executando o código acima o gráfico deve apresentar um grid como esse:

Como funciona o método grid

Para adicionar uma grade ao gráfico com matplotlib é só chamar a função grid e passar o valor True. Mas a função grid tem alguns parâmetros para alterar a aparência da grade. Veja alguns deles:
color: com o parâmetro color definimos a cor da grade.
linestyle: com esse parâmetro definimos o estilo da grade.
linewidth: esse parâmetro define a largura das linhas do grid.

Adicionando legendas ao gráfico com Matplotlib

Adicionando legendas ao gráfico com Matplotlib

Já aprendemos como adicionar texto no gráfico. E esses textos podem servir como legendas, mas adicionar legenda desse jeito não é o recomendado. Além de que existe um método melhor de adicionar legendas ao gráfico com a biblioteca matplotlib. E usando o jeito correto de adicionar legendas o gráfico ficara mais harmônico. Coisa que não aconteceria usando textos soltos no gráfico como legendas.

Como adicionar legendas ao gráfico

Para adicionar legendas no gráfico utilizamos o método legend. O método legend adiciona label no gráfico.

Exemplo
import numpy as np
import matplotlib.pyplot as plt

X = np.linspace(0, 6, 1024)
Y1 = np.sin(X)
Y2 = np.cos(X)

plt.xlabel('X')
plt.ylabel('Y')
plt.plot(X, Y1, c = (.40, 1.0, .21), lw = 3., label = 'sin(X)')
plt.plot(X, Y2, c = (.0, .40, 1.0), lw = 3., ls = '--', label = 'cos(X)')
plt.legend()
plt.show()

Executando o código acima o seu gráfico deve ser igual a esse:

Como funciona…

Todos os métodos do objeto pyplot tem um parâmetro adicional para adicionarmos legendas. Nesse exemplo utilizamos esse parâmetro para adicionar uma legenda para cada linha do gráfico. E o método legend renderiza essas legendas no gráfico.

Tem mais no método legend

O método legend tem alguns parametros uteis para alterar a aparência das legendas. Veja alguns desse parâmetros:

  • ‘loc’: o parâmetro loc define a localização da legenda. O valor padrão desse parâmetro é ‘best’. Assim a legenda será posicionada automaticamente na melhor posição. Outros valores aceito por esse parâmetro são: 'upper left' , 'lower left' , 'lower right' , 'right' , 'center left' , 'center right' , 'lower center' , 'upper center' , and 'center' .
  • ‘shadow’: o parâmetro shadow define se a legenda terá uma sombra. O valor padrão é False. O parâmetro pode receber dois valores True ou False.
  • ‘fancybox’: Esse parâmetro deixa a caixa da legenda arredondada se o valor passado for True. O valor padrão é False.
  • ‘title’: Esse parâmetro define a string passada como argumento como o título da caixa de legendas.

sábado, 9 de maio de 2020

Setas com Matplotlib

Setas com Matplotlib

Nos exemplos anteriores aprendemos a adicionar textos e caixas de textos. Colocar textos nos gráficos é muito útil para explicar um dado, uma parte dele ou chamar atenção para uma área do gráfico. Mas com a biblioteca matplotlib temos uma ferramenta mais apropriada para chamar atenção para uma área do gráfico. Essa ferramenta são as setas. Com setas apontando para uma região do gráfico, não tem como essa área passar despercebida. E nesse tutorial vamos aprender a adicionar setas no gráfico com a biblioteca matplotlib.

Como adicionar setas ao gráfico

Para adicionar setas ao gráfico utilizamos o método annotate. O método annotate nos permite criar alguns tipos de setas e adicionar no gráfico.

Exemplo
import numpy as np
import matplotlib.pyplot as plt

X = np.linspace(-4, 4, 1024)
Y = .25 * (X + 4.) * (X + 1.) * (X - 2.)

plt.annotate('Vale',
      horizontalalignment = 'left',
      verticalalignment = 'bottom',
      xytext = (-1.5, 3.),
      xy = (0.75, -2.7),
      arrowprops = dict(facecolor = 'black', shrink = 0.05))

plt.plot(X, Y)
plt.show()

Executando o código acima o gráfico deve ficar igual a este:

Como funciona o parâmetro annotate

O parâmetro adiciona uma seta com uma legenda no gráfico. Para isso o método precisar receber alguns argumentos, como no exemplo acima. O primeiro argumento é uma string que será uma legenda da seta. O segundo argumento alinha a seta a esquerda do gráfico. O terceiro argumento alinha a seta para a parte de baixo. O quarto argumento recebe as coordenadas da legenda. O quinto argumento recebe as coordenadas da ponta da seta. E o ultimo argumento define a cor e o quanto a seta ficara afastada da legenda.