segunda-feira, 11 de maio de 2020

Definindo a faixo dos eixos

Definindo a faixo dos eixos

Por padrão a biblioteca matplotlib defini a faixo dos eixos x e y baseado no maior e menor valor dos dados. Por exemplo, se o maior valor que você quer representar no gráfico é nove e o menor é dois, o maior valor do eixo será o nove e o menor o dois. Nesse tutorial vamos aprender a definir esses valores por nossa conta.

Como definir a faixa dos eixos

Para definir a faixa dos eixos a biblioteca matplotlib nos fornece duas funções: xlim e ylim. Com essa funções podemos definir a faixa dos eixos do gráfico. Veja um exemplo de utilização dessas funções abaixo:

Exemplo
import numpy as np
import matplotlib.pyplot as plt

coordenadas = np.random.rand(100, 2)
plt.scatter(coordenadas[:,0], coordenadas[:,1])

plt.xlim(-.5, 1.5)
plt.ylim(-.5, 1.5)

plt.show()

Executando o código acima você deve ter um gráfico parecido com esse:

Como funciona…

O que acabamos de fazer nesse exemplo foi aumentar a área de visualização. Com as configurações padrão do matplotlib a área visíbil é apenas a área com dados. As funções xlim e ylim nos permitem alterar esse comportamento. Nesse exemplo definimos que a área visível do eixo x deve começar do valor menos zero ponto cinco e seguir até um ponto cinco. E a mesma coisa com o eixo y.

Eixos com a mesma escala

Eixos com a mesma escala

Você já deve ter percebido, nos nosso tutoriais passados, que a biblioteca matplotlib usa escalas diferentes para cada eixo do gráfico. Para algumas situações esse comportamento não causa problemas, mas para outros pode ser motivo de dor de cabeça. Para evitar isso vamos aprender como utilizar a mesma escala nos dois eixos do gráfico.

Como usar a mesma escala nos dois eixos

Para usar a mesma escala nos dois eixos precisamos definir isso no objeto axes. Veja um exemplo:

Exemplo
import numpy as np
import matplotlib.pyplot as plt

coordenadas = np.random.rand(100, 2)
plt.scatter(coordenadas[:,0], coordenadas[:,1])

plt.axes().set_aspect('equal')
plt.show()

Executando o exemplo acima o resultado deve ser parecido com esse:

Passando o valor ‘equal’ para o método set_aspect definimos que os eixos terão a mesma escala.

Figuras com Matplotlib

Figuras com Matplotlib

Introdução

Como você já deve ter percebido criar uma biblioteca de plotagem de dados que seja possível criar gráficos robustos e altamente personalizados não deve ter sido fácil. Mas para a nossa felicidade os colaboradores da biblioteca matplotlib conseguiram. Com a biblioteca é possível criar gráficos complexos com poucas linhas de código. E o mais impressionante, assim como é fácil criar um gráfico com poucas linhas, é fácil personalizar esses gráficos com a mesma facilidade. Nos próximo tutoriais aprenderemos como modificar os elementos das figuras, como o sistema de coordenadas usado.

Várias figuras juntas com matplotlib

A analise de dados só é possível com outros dados para comparar. Esses dados podem ser outros dados ou o mesmo dado representado de forma de diferente. Representar o mesmo dado de forma diferentes permite o analista ter um ponto de vista diferente. Isso permite chegar a conclusões que não seriam possíveis apenas com uma representação dos dados. Mas fazer essas representações em gráficos diferentes poderia trazer o inconveniente dos gráficos ficarem separados. Para solucionar isso a biblioteca matplotlib nos permite criar vários gráficos em apenas um.

Como criar vários gráficos em apenas um

Para criar vários gráficos em apenas um podemos usar o método subplot2grid. Com ele é possível criar gráficos independentes e apresentá-los numa única figura. Veja como fazer isso no exemplo abaixo:

Exemplo
import numpy as np
from matplotlib import pyplot as plt

barras = [5., 25., 50., 20.]
c_pontos = np.random.rand(100, 2)
sin_x = np.linspace(0, 2 * np.pi, 100)
sin_y = np.sin(sin_x)

grid_size = (4, 2)

plt.subplot2grid(grid_size, (0, 0), rowspan = 3, colspan = 1)
plt.bar(range(len(barras)), barras)

plt.subplot2grid(grid_size, (0, 1), rowspan = 3, colspan = 1)
plt.plot(sin_x, sin_y)

plt.subplot2grid(grid_size, (3, 0), rowspan = 1, colspan = 2)
plt.scatter(c_pontos[:,0], c_pontos[:,1])

plt.tight_layout()
plt.show()

Executando o código acima o seu gráfico deve esta parecido com esse:

Como funciona a função subplot2grid

O que fazemos com a função subplot2grid é dividir o gráfico em linhas e colunas. Assim desenhamos os nosso gráficos em forma de retângulo e adicionamos esses retângulos a grade criada pela função subplot2grid.

Veja os parâmetros da função subplot2grid:

  • O primeiro parâmetro é uma tupla com o número de linhas e colunas que a grade deve ter.
  • O segundo parâmetro é uma tupla com as coordenadas onde o gráfico deve ficar na grade.
  • O terceiro parâmetro define quantas linhas da grade o nosso gráfico deve ocupar.
  • O quarto define quantas colunas o gráfico deve ocupar da grade.

A próxima chamada a funções do módulo pyplot definira o tipo de gráfico que será renderizado. Para cada novo gráfico, que será adicionado a grade, a função subplot2grid deve ser chamada.
Nesse exemplo criamos uma grade com quatro linhas e duas colunas. As duas primeiras figuras ocupam três linhas e uma coluna cada. A terceira figura ocupa uma linha e duas colunas, preenchendo todo o espaço da grade. Depois de ocuparmos todo o espaço da grade chamamos a função tight_layout. Essa função compacta todas as figuras e impede que uma figura se sobreponha a outra.

domingo, 10 de maio de 2020

Mais rótulos com Matplotlib

Mais rótulos com Matplotlib

No último tutorial apenas começamos a aprender sobre rótulos dos marcadores. A biblioteca matplotlib nos fornece bem mais métodos e funções para adicionar e alterar os rótulos dos nossos gráfico.

Um jeito mais simples…

No exemplo do tutorial anterior criamos um gráfico de barras com um rótulo em cada barra. Mas existe um jeito mais simples de conseguir o mesmo resultado utilizando menos código:

Exemplo
import numpy as np
import matplotlib.pyplot as plt

lista_nome = ('Milho', 'Trigo', 'Cevada', 'Centeio', 'Aveia')
safra = np.random.randint(0, 99, size = len(lista_nome))
posicao_lista = np.arange(len(lista_nome))

plt.bar(posicao_lista, safra, color = '.75', align = 'center')
plt.xticks(posicao_lista, lista_nome)
plt.show()

Executando o código acima o seu gráfico deve esta parecido com este:

Como funciona…

Nesse exemplo não utilizamos os métodos do módulo ticker. Em vez disso utilizamos o método xticks. Esse método recebe dois argumentos. O primeiro é uma lista com a posição das legendas e o segundo é uma lista contendo os nomes que serão usados como rótulos nos marcadores. O resultado é o mesmo do tutorial passado. Com a diferença que é mais fácil de lembrar e mais curto para escrever.

Tem mais…

Até agora usamos uma lista de nomes predefinidos para criar os rótulos dos nossos marcadores. Uma tarefa fácil com poucos elementos, mas imagine com dezenas de elementos. Já não é uma tarefa tão fácil. Outro cenário é que você pode querer um gráfico com rótulos de porcentagem. Você pode fazer uma lista com as porcentagens correspondentes, mas existe um jeito melhor. Veja o exemplo abaixo:

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

def f_rotulo(value, pos):
  return '%0.1f%%' % (100. * value)

ax = plt.axes()
ax.xaxis.set_major_formatter(ticker.FuncFormatter(f_rotulo))
x = np.linspace(0, 1, 200)

plt.plot(x, np.exp(-10 * x), c = (0., .40, 1.))
plt.plot(x, np.exp(-5 * x), c = (.2, 1., .2), ls = '--')
plt.show()

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

Como funciona…

Criamos uma função que retorna uma string com a porcentagem do valor passado como argumento. E utilizamos a função FuncFormatter. Essa função recebe uma função como parâmetro e chama essa função, passando o valor e a posição do marcador como argumento, toda vez que a função precisar criar um rótulo. O valor retornado pela função f_rotulo é usado para nomear os marcadores.

Rótulos de escalas com Matplotlib

Rótulos de escalas com Matplotlib

No tutorial anterior aprendemos a adicionar uma vaga aos marcadores do eixo x. Nesse vamos aprender a adicionar legendas a esses marcadores. Imagine que você tem cinco colunas que representam a produção de cinco produtos durante o mês de maio. Sem algum texto ou legenda não tem como você adivinhar qual coluna representa determinado produto. Felizmente a biblioteca matplotlib nos fornece maneiras de adicionar legendas para cada marcação do gráfico. E é exatamente isso que vamos aprender nesse tutorial.

Como adicionar rótulos de escalas

Adicionar rótulos de escalas no gráfico com a biblioteca matplotlib é fácil como criar uma lista. Isso porque só o que precisamos é criar uma lista e passar essa lista para o método FixedFormatter.

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

lista_nome = ('Milho', 'Trigo', 'Cevada', 'Centeio', 'Aveia')
safra = np.random.randint(0, 99, size = len(lista_nome))
posicao_lista = np.arange(len(lista_nome))

ax = plt.axes()
ax.xaxis.set_major_locator(ticker.FixedLocator((posicao_lista)))
ax.xaxis.set_major_formatter(ticker.FixedFormatter((lista_nome)))

plt.bar(posicao_lista, safra, color = '.75', align = 'center')
plt.show()

Executando o código acima o seu gráfico deve esta parecido com esse (lembre-se que os valores são escolhidos de forma aleatória):

Como funciona…

Primeiro criamos uma tupla com a lista de rótulos que serão usados no gráfico. Depois definimos a posição de cada elemento com o método ticker.FixedLocator. Assim garantimos que cada barra estará com um marcador ao centro. O método FixedFormatter adiciona os rótulos aos marcadores de acordo com a lista que recebeu.

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.