quinta-feira, 7 de maio de 2020

Mais texto com Matplotlib

Mais texto com Matplotlib

A biblioteca matplotlib nos permite fazer várias modificações no texto que queremos adicionar no gráfico. Além de definir a posição podemos definir o seu alinhamento e adicionar uma marcação no texto.

Alinhamento

O texto que será adicionado ao gráfico é limitado por uma caixa imaginaria. Utilizamos essa caixa para posicionar o texto no gráfico, em relação as coordenadas que passamos para o método text. Assim usamos o posicionamento horizontal e vertical para definir como o alinhamento será feito.
Essas são as opções de alinhamento vertical:

  • 'center': Relativo ao centro da caixa imaginaria do texto.
  • 'top': Relativo ao topo da caixa imaginaria do texto.
  • 'bottom': Relativo a parte de baixo da caixa imaginaria do texto.
  • 'baseline': Relativo a base do texto.

Opções de alinhamento horizontal:

  • 'center': relativo ao centro da caixa de texto.
  • 'left': relativo ao lado esquerdo da caixa de texto.
  • 'rigth': relativo ao lado direito da caixa de texto.

Personalizando caixa de texto

Para personalizamos a caixa de texto utilizamos o parâmetro bbox. O parâmetro bbox recebe um dicionario com as configurações de aparência da caixa de texto.

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

x = np.linspace(-4, 4, 1024)
y = .25 * (x + 4.) * (x + 1.) * (x - 2.)

box_setup = {
  'facecolor': '.75',
  'edgecolor': 'k',
  'boxstyle': 'round'
}

plt.text(0.5, -0.25, 'Vale', bbox=box_setup)
plt.scatter(x, y, c = x, cmap = cm.hot)
plt.show()

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

Como funciona…

O dicionário passado ao parâmetro bbox define as configurações de aparência da caixa de texto. Veja quais são os valores que o parâmetro aceita:
facecolor: define a cor de fundo usado na caixa de texto.
Edgecolor: define a cor que circunda a caixa de texto.
Boxstyle: define a aparência da caixa, se ela vai ser aredondada (round) ou quadrada (square).

Adicionando texto ao gráfico com Matplotlib

Adicionando texto ao gráfico com Matplotlib

Se você, por algum motivo, precisar colocar um texto dentro do gráfico você pode fazer isso sem muita complicação com a biblioteca matplotlib. Até aqui utilizamos legendas em lugares específicos como o título do gráfico e nos eixos x e y. Agora vamos aprender a colocar um texto em qualquer lugar do gráfico.

Como adicionar texto no gráfico

Para adicionar texto no gráfico com a biblioteca matplotlib utilizamos o método text.

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

x = np.linspace(-4, 4, 1024)
y = .25 * (x + 4.) * (x + 1.) * (x - 2.)

plt.text(0.5, -0.25, 'Vale')
plt.scatter(x, y, c = x, cmap = cm.hot)
plt.show()

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

Como funciona o método text

O método text recebe três argumentos. O primeiro argumento é a posição do eixo x do texto, o segundo argumento é a posição y e o terceiro é o texto que será adicionado no gráfico. Assim podemos adicionar qualquer texto em qualquer lugar do gráfico, apenas com o método text.

Adicionando uma legenda para cada eixo

Adicionando uma legenda para cada eixo

Com a biblioteca matplotlib podemos adicionar uma legenda para cada eixo. Isso é útil quando utilizamos dados que variam de acordo com duas variáveis. Como a variação de temperatura com o passar do tempo, o aumento da velocidade por hora, o aumento da pressão com a temperatura, entre outros dados. A biblioteca matplotlib nos permite a adição de legendas aos eixos do gráfico, para essas situações e outras situações, utilizando métodos.

Como adicionar legendas no gráfico com matplotlib

Para adicionar legendas aos eixos do gráfico utilizamos os métodos xlabel e ylabel.

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

x = np.arange(100)

faixa_cor = np.linspace(0, 100, len(x))

plt.title('Temperatura/Horas')
plt.xlabel('Horas')
plt.ylabel('Temperatura')
plt.scatter(x, x, c = faixa_cor, cmap = cm.hot)
plt.show()

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

Como funcionam os métodos xlabel e ylabel

O funcionamento dos dois métodos é bem simples. Para adicionar a legenda ‘Temperatura’ no eixo y passamos a string ‘Temperatura’ para o método ylabel. Com o método xlabel acontece a mesma coisa.

Usando notações no estilo LaTeX com Matplotlib

Usando notações no estilo LaTeX com Matplotlib

No exemplo anterior, quando adicionamos um título ao gráfico, o título utilizado foi uma string simples. Utilizando o mesmo método não seria possível adicionar uma formula matemática. Mas e se quisermos utilizar uma formula matemática para o título? Nesse caso teremos que utilizar o LaTex com a biblioteca matplotlib para adicionar uma formula matemática como título do nosso gráfico.
Utilizar formulas matemáticas como títulos de gráficos é interessante para mostrar qual foi a formula matemática utilizada para criar uma curva no gráfico. Mas muitas vezes você não vai precisar criar um gráfico com um título de formula matemática a não ser num contesto cientifico. Mas é sempre bom saber como se faz no caso de uma necessidade.

Mãos a obra…

Para trabalhar com o estilo LaTeX precisamos ter o LaTeX instalado no nosso computador. O o LaTeX instalado a biblioteca matplotlib pode interpretar as notações no estilo LaTeX e apresentar a formula de forma correta. Para baixar e instalar o LaTeX no seu computador acesse: https://en.wikibooks.org/wiki/LaTeX/Installation.
Obs: É possível que você não precise instalar o LaTeX.

LaTeX

As formula, matemáticas no estilo LaTeX, são escritas utilizando uma mistura de comandos e texto e armazenadas em arquivos de texto sem formatação. Com esse arquivo o LaTeX interpreta as instruções e renderiza a formula matemática.

Como utilizar o LaTeX num gráfico com matplotlib

Vamos criar uma curva no gráfico utilizando uma formula matemática e mostrar qual foi a famula utilizada no título do 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.title('$f(x)=\\frac{1}{4}(x+4)(x+1)(x-2)$')
plt.plot(X, Y, c = 'k')
plt.show()

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

Como funciona…

Como você pode ver no exemplo acima, não utilizamos um método novo para criar um título com uma formula matemática. A única diferença foi a string passada para o método title. Nessa string é possível perceber que a string começa e termina com um cifrão. Isso indica para a biblioteca matplotlib que essa string deve ser interpretada com o estilo LaTeX.
Uma coisa importante de se notar é que a linguagem LaTeX usa o caractere \ como caractere de escape, assim como a linguagem python. Nesses casos utilize duas barras invertidas.
Nesse exemplo usamos a linguagem LaTeX para criar um título, mas ela pode ser usada para criar qualquer tipo de texto como legendas, labels e títulos.

Adicionando título ao gráfico com Matplotlib

Adicionando título ao gráfico com Matplotlib

Introdução

Uma pratica muito comum e útil é adicionar títulos e legendas no seu gráfico. Não adianta ter dados num gráfico se você não sabe o que eles estão representando. Um gráfico além de representar os dados da maneira mais fiel possível, ele precisa ser compreendível. Uma tarefa quase impossível quando tudo que se tem no gráfico são linhas, pontos ou marcadores. Daí a importância de adicionar legendas e títulos aos gráficos. Com isso uma pequena olhada no gráfico já será suficiente para compreender os seus dados, pelo menos nos gráficos mais simples.

Adicionando um título

Para o nosso primeiro exemplos vamos fazer algo simples: adicionar um título ao nosso gráfico. A biblioteca matplotlib fornece um método para adicionarmos um título ao nosso gráfico de forma muito simples e rápida.

Como adicionar um título ao gráfico

Um título de um gráfico pode ser adicionado passando o título desejado para o método title.

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

x = np.random.randn(50, 1)
y = np.random.randn(50, 1)
faixa_cor = np.linspace(0, 8 * 2 * np.pi, 50)

plt.title('Meu título')
plt.scatter(y, x, c = faixa_cor, cmap = cm.viridis)
plt.show()

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

Como funciona o método title

O funcionamento do método title é muito simples. O recebe uma string e essa string passada para o método será o título do gráfico. Como no exemplo acima: passamos a string ‘Meu título’ e o título do gráfico é Meu título.

quarta-feira, 6 de maio de 2020

Definindo esquema de cores com Matplotlib

Definindo esquema de cores com Matplotlib


O esquema de cores padrão da biblioteca matplotlib é o fundo branco com os elementos do gráfico em preto. Esse é o padrão para a maioria dos elementos. Quando um elemento, que pode representar vários dados, é renderizado a biblioteca adiciona mais cores. E já aprendemos como mudar as cores desses elementos. Para a maioria das situações esse esquema de cores padrão da biblioteca já esta pronto para ser impresso. Mas e se você quiser que o fundo do gráfico fique na cor preta e os outros elementos que compõem o gráfico na cor branco? Isso é o que vamos aprender agora.

Como mudar o esquema de cores de um gráfico

Como já vimos antes a biblioteca matplotlib nos permite alterar a cor das linhas, dos pontos e dos diagramas de caixa. É possível alterar a cor dos elementos do gráfico um por um. Mas isso seria demorado. E existe um jeito mais rápido de fazer isso. A biblioteca matplotlib nos fornece um jeito de fazer isso mais facilmente, já que todos os objetos da biblioteca escolhem uma cor de um objeto centralizado.
Nesse exemplo vamos utilizar as configurações centralizadas da biblioteca matplotlib para criar um gráfico com o fundo preto:
Exemplo
import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt

mpl.rcParams['lines.linewidth'] = 2
mpl.rcParams['axes.facecolor'] = 'k'
mpl.rcParams['axes.edgecolor'] = 'w'
mpl.rcParams['xtick.color'] = 'w'
mpl.rcParams['ytick.color'] = 'w'
mpl.rcParams['figure.facecolor'] = 'k'

X = np.linspace(0, 7, 1024)
plt.plot(X, np.sin(X))
plt.plot(X, np.cos(X))
plt.show()
Executando exemplo acima o gráfico mostrado deve ser igual a esse:

Como funciona a centralização de configurações do matplotlib

O objeto rc funciona como um objeto centralizador de configurações. Todo objeto que vai ser desenhado no gráfico procura suas configurações padrão no objeto rc. Assim se os valores das propriedades cor e largura do objeto rc forem alterados, todos os outros elementos terão as mesma configurações por padrão.

Crie seus próprios marcadores com Matplotlib

Crie seus próprios marcadores com Matplotlib


Na biblioteca matplotlib existem muitos marcadores que podem ser usados em diversas situações para representar um tipo de dado. Mas cada projeto tem suas necessidades e especificações. E não é raro você precisar de um marcador próprio para um projeto. Não sendo adequado os marcadores padrão da biblioteca. Como um projeto onde você precisa criar um marcador com a silhueta de um edifício, animal ou uma marca. Se esse é o seu caso não se preocupe pois a biblioteca matplotlib nos permite criar nossos próprios marcadores.

Como criar marcadores com a biblioteca matplotlib

A criação de um marcador segue a mesma logica da criação de um gráfico com pontos interligados. Para criar um gráfico precisamos das coordenadas de cada nó do gráfico. Quando existe mais de um nó no gráfico uma linha é traçada de um ponto ao outro, e assim sucessivamente até o último ponto, criando um figura. Na criação de um marcador seguimos a mesma lógica. Criamos os nós com as coordenadas e no final temos um conjunto de pontos conectados que formam uma imagem.
Exemplo
import numpy as np
import matplotlib.path as mpath
from matplotlib import pyplot as plt

forma = [
  (0., -2., mpath.Path.MOVETO),
  (2., 0., mpath.Path.LINETO),
  (0., 2., mpath.Path.LINETO),
  (-2., 0., mpath.Path.LINETO),
  (0., -2., mpath.Path.CLOSEPOLY)
]

u, v, codes = zip(*forma)
novo_marcador = mpath.Path(np.asarray((u, v)).T, codes)
dados = np.random.rand(8, 8)
plt.scatter(dados[:,0], dados[:, 1], color=(1., 0., .40), marker=novo_marcador, s=64)
plt.show()
Executando o código acima o seu gráfico deve parecer com esse:

Como funciona…

Nos exemplos anteriores passamos uma string para o parâmetro marker. Isso porque esses marcadores são marcadores predefinidos da biblioteca matplotlib. Assim só precisamos passar, como argumento do parâmetro, uma string correspondente a um marcador predefinido. Por isso só precisamos passar uma string. Mas o argumento do parâmetro marker também pode ser uma instância do Path.
O método path é o responsável por criar o nosso novo marcador. Esse método deve receber dois argumentos: as coordenadas de cada ponto da nossa figura e uma instrução. Para facilitar o entendimento criamos uma lista com as coordenadas e a instrução. Assim não precisamos ter duas listas separadas, uma com as coordenadas e outra com as instruções. Mais o método path não pode receber essa lista do jeito que está, as coordenadas e as instruções devem estar separadas. Por isso usamos a função zip, que faz esse trabalho para nos.
O nosso marcador toma forma com o movimento do curso entre os pontos. Para o cursor saber o que esta fazendo ele precisa de instruções. Esse curso pode receber essas três instruções:
  • MOVETO: Com essa instrução o cursor é posicionado na coordenada informada, mas nenhuma linha é desenhada.
  • LINETO: Com essa instrução o curso é posicionado em outra posição. E dessa vez uma linha é traçada.
  • CLOSEPOLY: Com essa instrução fechamos o nosso polígono/marcador.
Com isso podemos criar um marcador com qualquer forma que desejamos. É só ter paciência e descrever as coordenadas da figura que se deseja utilizar como marcador. Outra alternativa é converter de um desenho SVG.