terça-feira, 12 de maio de 2020

Escala logarítmica com Matplotlib

Escala logarítmica com Matplotlib

Alguns dados podem descrever uma curva pouco perceptível com uma escala geométrica. Tornando a analise dos dados pouco produtiva. Mas felizmente a biblioteca matplotlib nos fornece meios de alterar a escala do gráfico. Assim podemos alterar a escala geométrica do gráfico para uma logarítmica. Desse modo podemos visualizar todo o conjunto de dados, mesmo aqueles que descrevem uma curva exponencial.

Como alterar a escala do gráfico

A biblioteca matplotlib nos permite mudar a escala do gráfico de várias formas. A maneira que vamos utilizar nesse tutorial serve para qualquer tipo de dados, não somente para curvas. Veja como alteramos a escala do gráfico:

Exemplo
import numpy as np
import matplotlib.pyplot as plt

x = range(1, 10)
y = np.exp2(x)

plt.yscale('log')
plt.plot(x, y)
plt.show()

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

Como funciona…

Nesse exemplo utilizamos a função yscale para alterar a escala do eixo y. Para utilizar uma escala logarítmica passamos o valor ‘log’ para a função. Por padrão a escala logarítmica tem base dez mas podemos alterar esse comportamento com o parâmetro basey. Para alterar a escala do eixo x a função utilizada é a xscale. E o parâmetro para alterar a base usada pela função é o basex.

Inserindo subfiguras com Matplotlib

Inserindo subfiguras com Matplotlib

Com a biblioteca matplotlib podemos adicionar pequenas figuras ao nosso gráfico. Essas figuras podem ser úteis para mostrar um área do gráfico em zoom ou uma visão mais geral dele. Esse tipo de visualização é muito útil por questão de praticidade. Com esse recurso você não precisa ficar movimentando o gráfico. A área que você precisa ver com detalhe ou uma visão geral pode ser adicionada ao gráfico como uma subfigura. É o que vamos aprender agora nesse tutorial.

Como adicionar subfiguras ao gráfico

A biblioteca matplotlib nos permite criar uma subfigura em qualquer região do gráfico. Nesse exemplo vamos criamos uma subfigura para mostrar uma parte do gráfico:

Exemplo
import numpy as np
import matplotlib.pyplot as plt

cdnd = np.random.rand(100, 2)

plt.scatter(cdnd[:,0], cdnd[:,1])

sub_axes = plt.axes([.6, .6, .25, .25])
sub_axes.scatter(cdnd[:,0], cdnd[:,1], c = (1., 0., .40))
plt.setp(sub_axes)

plt.show()

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

Como funciona…

Nesse exemplo criamos uma representação dos dados com um tamanho do gráfico. E adicionamos esse mini gráfico no próprio gráfico. Para fazer isso primeiro nos criamos uma pequena região no gráfico com a função axes. Depois criamos o mini gráfico com a função scatter do objeto axes. Essa função scatter funciona da mesma maneira da função scatter do objeto pyplot, criando pontos no gráfico. E depois chamamos a função setp. Essa função é utilizada para definir as propriedades do gráfico. Nesse caso um gráfico com uma subfigura.

segunda-feira, 11 de maio de 2020

Proporção com Matplotlib

Proporção com Matplotlib

Um gráfico pode ser usado em vários lugares diferentes, como num jornal, numa revista ou num web site. E para cada local que o gráfico vai ser usado o espaço pode ser abundante ou escaço. Talvez pra uma publicação num web site você precise que o gráfico seja mais largo do que alto, ou vice-versa, para poder se encachar no espaço disponível. Por isso é importante aprender a modificar a proporção do gráfico. E é isso que vamos aprender a fazer nesse tutorial.

Como mudar a proporção de um gráfico com matplotlib

A biblioteca matplotlib nos fornece uma maneira muito simples de mudar a proporção do gráfico. Com apenas uma função podemos fazer isso. Veja um exemplo abaixo:

Exemplo
import numpy as np
import matplotlib.pyplot as plt

coordenadas = np.random.rand(100, 2)

plt.figure(figsize = (10.24, 2.56))
plt.scatter(coordenadas[:,0], coordenadas[:,1])

plt.show()

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

Como funciona...

O objeto figure é criado toda vez que criamos um gráfico. Mas quando criamos um objeto figure, por conta própria, podemos modificar algumas de suas propriedades. E uma dessas propriedades é a proporção. Nesse exemplo criamos uma figura com uma proporção 4:1. A proporção da figura é definida pelo parâmetro figsize. No exemplo acima passamos uma tupla com os valores em polegadas. O primeiro elemento da tupla define a largura da figura e o segundo a altura.

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.