terça-feira, 19 de maio de 2020

Criando PDF e SVG com Matplotlib

Criando PDF e SVG com Matplotlib

Algumas vezes o que você quer não é um arquivo bitmap como o PNG. O que um arquivo bitmap faz é criar uma matriz de pontos que representam uma imagem. Se você olhar a imagem mais de perto (dar zoom), você vai ver esses pontos e a imagem começa a perder a forma. E isso se torna mais evidente dependendo do algorítimo de amostragem. Para mudar isso podemos usar imagens vetoriais, que são invariáveis independente da escala. Não importa a escala que a imagem esteja sendo visualizada, a figura continua a mesma, com a mesma qualidade de detalhes. Por essa e outras propriedades as imagens vetoriais são usadas em documentos maiores, sem precisar criar uma nova imagem com uma resolução maior, como fizemos no tutorial anterior. Com a biblioteca matplotlib podemos criar imagens vetoriais, como imagens em PDF e SVG.

Como criar uma arquivo pdf com Matplotlib

Criar um arquivo pdf com a biblioteca matplotlib é uma tarefa fácil. Veja no exemplo a baixo como isso é feito:

Exemplo
import numpy as np
from matplotlib import pyplot as plt

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

plt.scatter(coordenadas[:,0], coordenadas[:,1], color = (1., 0., .40))
plt.savefig('imagem.pdf')

Executando esse código um arquivo pdf vai ser criado na mesma pasta do script. A imagem do arquivo pdf deve ser parecida com essa:

Como funciona…

Já estudamos o método savefig anteriormente. Utilizamos esse método para criar um arquivo png no tutorial anterior. Com esse método apenas passar o nome do arquivo já é suficiente para definir se um arquivo será um PNG, PDF ou SVG. Tudo que você precisa fazer é passar a extensão do arquivo que você deseja criar. A biblioteca matplotlib vai ver a extensão do arquivo e criá-lo.

segunda-feira, 18 de maio de 2020

Controlando a resolução da imagem

Controlando a resolução da imagem

Se não alterarmos as configurações da biblioteca matplotlib, quando criamos uma imagem de bitmap, a biblioteca define o tamanho e a resolução da imagem. Para a maioria dos usos dessas imagens, o tamanho e a resolução escolhidos pela biblioteca matplotlib vai servir para a maioria das situações. Mas o matplotlib nos permite definir essas propriedades por conta própria. Por exemplo, se você precisar criar uma imagem para ser usada num cartas é interessante que a resolução dessa imagem seja grande. Outro cenário é utilizar essa imagem como uma miniatura, nessa caso a resolução não precisar ser tão alta. Nesse tutorial vamos aprender a definir a resolução das imagens.

Como definir a resolução de uma imagem

O método savefig nos permite definir a resolução de uma imagem através do parâmetro opcional dpi. Veja uma exemplo de utilização do parâmetro dpi:

Exemplo
import numpy as np
from matplotlib import pyplot as plt

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

plt.scatter(coordenadas[:,0], coordenadas[:,1])
plt.savefig('imagem.png', dpi = 350)

Nesse exemplo, criamos um gráfico com vários pontos. Como passamos o valor 350 para o parâmetro dpi, a imagem tem uma resolução de 2240 pixels por 1680 pixels. Veja a imagem abaixo, é quase a mesma do exemplo passado, a diferença é a resolução que é muito maior:

Como funciona…

Com o parâmetro dpi podemos controlar a resolução da imagem. Esse parâmetro recebe o valor da resolução em DPI (pontos por polegadas). Para aqueles que não utilizam a polegada como uma metida padrão, uma polegada equivale a dois vírgula cinquenta e quatro centímetros. Essa medida define que em uma polegada da imagem teremos uma certa quantidade de pontos. Para a maioria das impressoras à jato de tinta a qualidade máxima da resolução é trezentos pontos por polegadas.

Trabalhando com transparência

Trabalhando com transparência

Quando criamos uma imagem é muito difícil que pretendemos usar essa imagem isolada, sempre teremos outras imagens ou outros elementos acompanhando ela. Por exemplo, essa imagem pode ser parte de uma apresentação ou até mesmo uma imagem de um site. E em alguns desses casos é preciso que os elementos da imagem sejam integrados com outros elementos. E uma coisa indispensável para essa integração é a transparência. Assim os elementos de um gráfico podem ser integrados com outros elementos de forma mais homogenia. Nesse tutorial vamos aprender a criar imagens com transparência.

Como criar uma imagem com transparência com a biblioteca matplotlib

Um ótimo jeito de observar a transparência de uma imagem é adicioná-la a uma pagina web. Porque a imagem transparente vai se misturar com o fundo da página web. Uma coisa importante é que todos os arquivos desse tutorial devem estar na mesma pasta. Porque nesse tutorial vamos criar uma imagem com transparência e criar uma pagina web que incluí essa imagem como um dos elementos que compõem a página.

Criando uma imagem PNG com o fundo transparente

Para criamos uma imagem com transparência vamos usar a o método savefig, como já usamos antes. Mas dessa vez vamos definir o parâmetro transparent como True.

Exemplo
import numpy as np
from matplotlib import pyplot as plt

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

plt.scatter(coordenadas[:,0], coordenadas[:,1])
plt.savefig('imagem-1.png', transparent = True, c = (0., .40, 1.))

Criando uma pagina web para adicionar a imagem

Agora vamos criar uma pagina web com um background e usar a imagem com transparência nessa pagina web. Copie e cole o codigo html abaixo em um editor de sua preferência e salve com a extensão html:

Exemplo
<html>
  <!--Define a cor de fundo como sendo cinza. Experimente mudar para Red-->
  <body style="background-color:LightGray;">
    <img src="imagem-1.png" width="640" height="480"></img>
  </body>
</html>

Abrindo o arquivo html, que acabamos de criar, no navegador você deve ter um resultado parecido com o exemplo mostrado abaixo. Note como a imagem com o fundo transparente se mescla com a pagina web.

Como funciona…

O método savefig, por padrão, não adiciona informações de transparência na imagem PNG. Mudamos esse comportamento passando o valor True para o parâmetro transparent.

Criando um arquivo png

Criando um arquivo png

Introdução

Como a maioria das figuras técnicas, as figuras cientificas não são apresentadas de forma independente, geralmente essas figuras são uma parte de um documento maior. A biblioteca matplotlib pode exportar os gráficos criados para alguns do formatos mais utilizados, como SVG, PNG, EPS, e PDF. Todas as vezes que criamos um gráfico, a biblioteca matplotlib mostra esse gráfico com uma interface que permite salvar a imagem do gráfico. Para um punhado de gráficos essa abordagem pode ser valida, mas quando falamos de um número muito maior de imagens essa abordagem acaba por se tornar um problema. Principalmente se você precisa criar o mesmo gráfico com alguns valores diferentes. Nos próximos tutoriais vamos aprender a utilizar os recursos de saída de arquivos da biblioteca matplotlib. Como definir o tamanho da imagem, a resolução e a transparência.

Criando uma imagem PNG com a biblioteca matplotlib

Se não alterarmos as configurações da biblioteca matplotlib, todas as vezes que criamos um gráfico ele será mostrado numa janela que nos permite movimentar a imagem, salvar, dar zoom, entre outras coisas. Para a criação de protótipos essa abordagem é muito útil e eficiente, mais quando falamos de usos comuns, isso já não é mais verdade. Por exemplo, criar uma duzia de figuras para serem adicionadas a relatórios gerados automaticamente. Você pode querer criar uma imagem para cada arquivo com dados. E boas noticias, você pode! A biblioteca matplotlib nos permite criar imagens com uma grade flexibilidade.
Para o nosso primeiro exemplo, vamos criar uma imagem no formato PNG. Um arquivo ideal para a saída bitmap é o PNG, isso por ser o padrão de imagens bitmap. O padrão bitmap é suportado pela maioria dos visualizadores de imagens, por ser um algorítimo de compressão sem perdas e suportar a transparência, o que não acontece com o JPEG.

Como criar uma imagem PNG

Para salvar uma imagem no disco, ao invés de mostrar numa janela, trocamos o método show pelo savefig. Assim pedimos que a biblioteca matplotlib salve o arquivo no disco e não mostrá-lo numa janela.

Exemplo
import numpy as np
from matplotlib import pyplot as plt

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

plt.scatter(coordenadas[:,0], coordenadas[:,1])
plt.savefig('imagem.png', c = (0., .40, 1.))

Executando esse código, ao invés de mostrar uma janela com o gráfico, é criado uma imagem na mesma pasta do código. Nesse exemplo foi criado uma imagem png com uma resolução de 640×480 pixels. Veja a imagem abaixo:

Como funciona o método savefig

O método savefig funciona de modo semelhante ao método show. A diferença é que o método savefig mostra uma janela com o gráfico e o método savefig cria uma imagem com o mesmo gráfico. A função savefig não cria janelas e sim imagens. Desse modo, todos os comandos funcionam da mesma maneira, independentemente da saída final, seja ela uma janela ou um arquivo.
O método savefig tem vários parâmetros opcionais para modificar a saída do arquivo, veremos esses parâmetros nos próximos tutoriais.

domingo, 17 de maio de 2020

Coordenadas polares com Matplotlib

Coordenadas polares com Matplotlib

Na matemática, uma coordenada polar é utilizado como um sistema de coordenadas bidimensional onde cada ponto no plano é determinado por uma distância e um ângulo em relação a um ponto fixo de referência. Esse ponto de referência é chamado de polo, e a semirreta do polo na direção de referência é chamado de eixo polar.
As coordenadas polares são uma boa escolha para representar dados que se repetem num determinado período de tempo, como numa safra, no ano, ou até mesmo no dia. Nesse tutorial vamos aprender como utilizar coordenadas polares nos nossos gráficos.

Como plotar uma curva polar

No exemplo abaixo vamos criar uma curva polar usando a biblioteca matplotlib:

Exemplo
import numpy as np
import matplotlib.pyplot as plt

a = np.linspace(0 , 2 * np.pi, 1024)

plt.axes(polar = True)
plt.plot(a, 1. + .25 * np.cos(16 * a), c = (.2, 1., .2))
plt.show()

Executando o exemplo acima você deve ter como resultado um gráfico com coordenas polares igual a este:

Como funciona…

Nos exemplos anteriores já criamos objetos axes com o método axes. E sabemos que fazendo isso diretamente podemos personalizar as configurações, como nesse caso onde definimos que a projeção seria polar. Definimos isso passando o valor True para o parâmetro polar.

Tem mais…

O gráfico de projeções polares é muito utilizado para desenhar curvas. Mas podemos utilizar o mesmo tipo de projeção para representar barras ou criar polígonos. Por exemplo, uma coisa interessante que podemos fazer com a projeção polar e utilizando polígonos é um gráfico de radar. Veja como criar um gráfico de radar no exemplo abaixo:

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

axes = plt.axes(polar = True)
teta = np.linspace(0, 2 * np.pi, 8, endpoint = False)
raio = .25 + .75 * np.random.random(size = len(teta))
pontos = np.vstack((teta, raio)).transpose()
plt.gca().add_patch(patches.Polygon(pontos, color = (0., .40, 1.)))
plt.show()

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

Nesse exemplo as coordenadas do polígono (pontos) são ângulos e a distância do centro. Desse jeito não precisamos fazer conversões de coordenadas polares para cartesianas.

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.