quarta-feira, 6 de maio de 2020

Estilo de preenchimento com Matplotlib

Estilo de preenchimento com Matplotlib


Se por algum motivo você precisar criar um gráfico de barras com a mesma cor, você vai precisar usar algum artificio para conseguir distinguir de um dado do outro. E um bom modo de fazer isso é preencher a barra com um padrão. Assim, mesmo que as cores sejam idênticas, ainda será possível distinguir uma barra da outra.

Como preencher uma barra com um padrão

Para preencher uma barra com algum padrão, utilizamos o parâmetro hatch.
Exemplo
import numpy as np
import matplotlib.pyplot as plt

n_barras = 8
y1 = np.random.random(n_barras)
y2 = np.random.random(n_barras)
x = np.arange(n_barras)

plt.bar(x, y1, color = (.40, 1.0, .21), hatch = '.')
plt.bar(x, y1 + y2, bottom = y1, color = (.0, .40, 1.0), hatch = '*')
plt.show()
Executando o exemplo acima o resultado deve ser um gráfico parecido com este:

Como o parâmetro hatch funciona

O parâmetro hatch pode receber alguns valores. E de acordo com o valor passado ao parâmetro, a barra será preenchida com um padrão diferente. Veja alguns valores aceito pelo parâmetro hatch:
  • /
  • \
  • |
  • -
  • +
  • x
  • o
  • O
  • .
  • *
Para cada valor passado ao parâmetro hatch, existe um padrão de preenchimento. No nosso caso usamos o asterisco e o ponto. O que resultou no preenchimento com estrelas e pontos, respectivamente.
Se você precisar trocar a cor do padrão de preenchimento use o parâmetro edgecolor. O parâmetro edgecolor funciona como o parâmetro color, recebendo valores com três cores, quatro cores, nomes definidos e tons de cinza.

domingo, 3 de maio de 2020

Padrão e espessura da linha com Matplotlib

Padrão e espessura da linha com Matplotlib


Algumas gráficas só trabalham com cores em tons de cinza. E em muitos casos essas cores se resumem em três níveis de cinza. Nessa condições não é muito fácil criar um gráfico para representar mais de três dados distintos. E é ai que a biblioteca matplotlib entra. Ela fornece maneiras de tornar elementos com a mesma cor diferentes. Como por exemplo, diferenciando elementos pela espessura e padrão. Um elemento com a mesma cor, mas com padrão e espessura diferentes, podem ser facilmente reconhecidos como um novo grupo de dados, independente da cor.

Como alterar o padrão e espessura da linha

Para alterar as cores usadas no gráfico passamos valores para o parâmetro color e, em alguns casos, para o parâmetro colormaps. Para alterar o padrão ou estilo de uma linha, também passamos valores para um parâmetro. Nesse caso, o linestyle.
Exemplo
import matplotlib.pyplot as plt

x = [0, 1, 2, 3, 4]
y1 = [0, 1, 2, 3, 4]
y2 = [0, 2, 4, 6, 8]
y3 = [0, 3, 5, 7, 9]

plt.plot(x, y1, color = 'k', linestyle = 'solid')
plt.plot(x, y2, color = 'k', linestyle = 'dashed')
plt.plot(x, y3, color = 'k', linestyle = 'dashdot')
plt.show()
A execução do código acima resulta no gráfico abaixo:

Como funciona o parâmetro linestyle

O parâmetro linestyle pode receber quatro valores diferentes. Para cada valor a linha vai ser traçada com um padrão diferente. Esses são os quatro valores que o parametro linestyle pode receber:
  • solid
  • dashed
  • dotted
  • dashdot

Tem mais…

A largura da linha

Não é só o estilo do tracejado da linha que pode ser alterado. O parâmetro linewidth nos permite definir a largura da linha. Por padrão o valor desse parâmetro é um. Nos podemos alterar esse valor para chamar atenção para uma linha especifica com um dado ligeiramente mais relevante.
Exemplo
import matplotlib.pyplot as plt

x = [0, 1, 2, 3, 4]
y1 = [0, 1, 2, 3, 4]
y2 = [0, 2, 4, 6, 8]
y3 = [0, 3, 5, 7, 9]

plt.plot(x, y1, color = 'k', linestyle = 'solid', linewidth = 2)
plt.plot(x, y2, color = 'k', linestyle = 'dashed', linewidth = 3)
plt.plot(x, y3, color = 'k', linestyle = 'dashdot', linewidth = 1.7)
plt.show()
O código acima resulta no gráfico abaixo:


Nesse exemplo, podemos perceber que quanto maior for o valor passado para o parâmetro linewidth maior será a largura da linha.

Função bar com colormaps

Função bar com colormaps


Muitas funções da biblioteca matplotlib tem suporte ao uso de mapas de cores. Uma dessas funções e a função scatter (E outras que veremos nos próximos tutoriais). Infelizmente a função bar não possui suporte ao uso de colormaps. Mas isso não significa que não podemos usar um mapa de cores para definir as cores das barras da função bar.
A biblioteca matplotlid fornece funções para gerar uma lista de cores a partir de um colormap. E com essa lista de cores podemos passar para o parâmetro color da função. Assim, não é necessário que uma função tenha suporte ao uso de colormaps para podemos usar um colormap.

Como usar colormaps com a função bar

Assim como fizemos no exemplo anterior, vamos usar o módulo matplotlib.cm. Mas com uma diferença: vamos utilizar o objeto diretamente, em vez de permitir que uma função faça a renderização das cores automaticamente. Também vamos precisar importar o módulo matplotlib.colors. Esse módulo contêm funções para criação de cores e manipulação. Como veremos a seguir:
Exemplo
import numpy as np
import matplotlib.cm as cm
import matplotlib.colors as col
import matplotlib.pyplot as plt

dados = np.random.randint(99, size = 50)
mapa_cores = cm.ScalarMappable(col.Normalize(0, 99), cm.winter)
plt.bar(np.arange(len(dados)), dados, color = mapa_cores.to_rgba(dados))
plt.show()
Executando o código acima o resultado deve ser um gráfico com barras parecido com esse:

Como funciona…

Primeiro criamos uma matriz com cinquenta números aleatórios entre zero e noventa e nove. Depois criamos uma lista de cores escalar com as cores normalizadas do mapa de cores winter. Depois a função to_rgba converte a lista de valores para uma lista de cores. Desse jeito usamos um colormap na função bar, mesmo que a função não tenha suporte a colormaps.

Função scatter com colormaps

Função scatter com colormaps


Quando se trabalha com muitas cores num gráfico, um dos problemas é achar uma combinação de cores adequada. Outro problema é o trabalho que isso da. Escrever cada cor uma por uma é demorado. Para resolver esses dois problemas a biblioteca matplotlib colormaps (mapas de cores). Com um colormaps você não precisar se preocupar com a combinação de cores e nem de escrever uma por uma. Os mapas de cores fornecem cores de forma continua baseado numa cor ou em varias.

Como usar colormaps com a função scatter

O módulo matplotli.cm fornece muitos mapas de cores. Além disso esse módulo fornece funções para você criar o seu próprio mapa de core. Um coisa que não é muito usado,pelo menos por min. Já que os mapas de cores, que vem no módulo matplotlib.cm, são numerosos e servem para a maioria das necessidades.
Nos exemplos anteriores, com a função scatter, usamos o parâmetro color com uma lista de cores. Os colormaps funcionam como uma lista de cores, com a diferença que as cores seguem uma sequência lógica. E ao invés de usar o parâmetro color vamos usar o cmap.
Exemplo
import numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt

Numero_Cores = 50
angulo = np.linspace(0, 8 * 2 * np.pi, Numero_Cores)
raio = np.linspace(.5, 1., Numero_Cores)
x = raio * np.cos(angulo)
y = raio * np.sin(angulo)

plt.scatter(x, y, c = angulo, cmap = cm.viridis)
plt.show()
Executando o código acima o gráfico apresentado deve ser igual a esse:

Como funciona o parâmetro cmap

O parametro cmap recebe um mapa de cores. Isso define quais cores serão usadas. E o parâmetro c define o número de cores que será usado.
Nesse exemplo, usamos o mapa de cor viridis. Que é um mapa de cores que vai do roxo ao amarelo. Com o parâmetro c definimos que nosso gráfico vai ter cinquenta cores do mapa de cores viridis. Em todos os mapas de cores o espaçamento entre as cores é uniforme. Assim as cores vão aumentando da cor com o menor valor para a maior (no nosso caso, do roxo para o amarelo).

sexta-feira, 1 de maio de 2020

Gráfico de pizza com cores personalizadas

Gráfico de pizza com cores personalizadas


Assim como os gráficos com barras, os gráficos em pizza podem ser muito melhor aproveitados com cores personalizadas. Essa customização das cores pode ser feita através de um parâmetro opcional. Nesse parâmetro devem ser passados os valores das fatias do gráfico.
Exemplo
import matplotlib.pyplot as plt

dados = (12, 18, 20, 13, 17, 30)
colores = ((1.0, 0.0, .40), (0.0, .40, 1.0), (.40, 1.0, .20))

plt.pie(dados, colors = colores)
plt.show()
Executando o código acima o resultado deve ser esse gráfico:

Como funciona o parâmetro colors

Ao contrario da função bar, o parâmetro que personaliza as cores do gráfico em pizza, é o parâmetro colors (no plural). O parâmetro colors recebe uma lista de tuplas com as cores desejadas.
É importante notar que nesse exemplo existem seis fatias no gráfico e passamos apenas três cores para o parâmetro colors. No parâmetro color da função bar, precisaríamos passar uma cor para cada barra do gráfico. O parâmetro colors da função pie não precisamos informar uma cor para cada fatia. Se o número de cores for menor que o número de fatias do gráfico as cores se repetem.

Barras com cores personalizadas

Barras com cores personalizadas


Os gráficos com barras talvez seja o tipo de gráfico mais conhecido. Sendo muito utilizado em apresentações e sites na internet. Principalmente para representar o aumento ou diminuição de algum dado. Ou simplesmente comparar dados. O que é mais fácil com gráficos com barras de cores diferentes. E é isso que vamos fazer agora.

Como personalizar a cor das barras do matplotlib

A escolha da cor das barras do matplotlib é feita passando a cor desejada para o parâmetro color. O valor da cor pode ser passado com três cores, quatro cores, nomes definidos ou em níveis de cinza. Assim como nos exemplos anteriores.
Exemplo
import matplotlib.pyplot as plt
from numpy import arange, array

x = arange(4)
nascimento_meninos = array([15, 16, 18, 17])
nascimento_meninas = array([14, 19, 18, 15])

plt.barh(x, nascimento_meninos, color = (.0, .40, 1.))
plt.barh(x, -nascimento_meninas, color = (1.0, .0, .40))
plt.show()
O resultado do código acima deve ser o gráfico abaixo, com barras na vertical vermelhas e azuis:

Como funciona...

Quando chamamos a função barh, passamos para o parâmetro color uma tupla com três valores (cores RGB), cada um referente às cores vermelho, verde e azul, respectivamente.
É importante notar que os valores das cores variam de 0 até 1. É como fazer uma receita. Para criar um vermelho mais para o rosa, se usa três ingredientes: vermelho, verde (nada) e um pouquinho de azul.

Tem mais...

Também podemos passar uma lista de cores para o parâmetro color.
Exemplo
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(4)
y = np.random.randn(4)

nivel_cinza = ['.25', '.50', '.75', '.90']

plt.bar(x, y, color = nivel_cinza)
plt.show()
Nesse exemplo, passamos para o parâmetro color uma lista de strings com os valores em níveis de cinza.
É importante lembra que o número de cores deve coincidir com o número de barras.

Gráficos de dispersão com cores personalizadas

Gráficos de dispersão com cores personalizadas


Assim como podemos personalizar as cores das retas no exercício anterior, podemos personalizar as cores dos pontos do nosso gráfico. É o que veremos a seguir.

Mãos a obra...

A função scatter disponibiliza duas opções para controlar as cores dos pontos através do seu parâmetro color: Uma cor para todos os pontos: se o valor passado para o parâmetro for uma cor valida, todos os pontos do gráfico vão ter a mesma cor. Uma cor diferente para cada ponto: também podemos criar cada ponto com uma cor especifica. Mas para fazer isso precisamos criar uma lista com cores matplotlib válidas.

Como fazer pontos com diferentes cores

Nesse primeiro exemplo vamos criar um conjunto de dados, A e B. Cada conjunto vai ser desenhado no gráfico com uma cor diferente. Por isso vamos chamar a função scatter duas vezes, uma para cada cor.
Exemplo
import matplotlib.pyplot as plt
from numpy.random import randn

a = randn(100, 2)
b = randn(100, 2)

plt.scatter(a[:,0], a[:,1], color = (.0, .10, 1.))
plt.scatter(b[:,0], b[:,1], color = (.0, .80, .2))

plt.show()
A execução do código acima deve resultar num gráfico parecido com esse:

Usando uma lista de cores

Para usar uma lista com cem cores, precisamos de cem coordenadas de pontos.
Nesse exemplo vamos fazer um gráfico com cem pontos aleatórios e uma lista de cores com cem cores aleatórias.
Exemplo
import matplotlib.pyplot as plt
from numpy.random import randn, rand

a = randn(100, 2)

lista_cor = rand(100, 3)

plt.scatter(a[:,0], a[:,1], color = lista_cor)

plt.show()
O resultado deve ser um gráfico parecido com esse:

Como o parâmetro color recebe os valores

O parâmetro color pode receber os valores isolados, como acontece no primeiro exemplo, e em listas, como acontece no segundo exemplo. Os valores passados podem ser tantos numéricos como strings (no caso de nomes de cores definidos).

Tem mais...

Se por algum motivo você precisar criar uma borda nos pontos, isso é possível com o parâmetro edgecolor.
O parâmetro edgecolor cria uma borda no ponto com a cor passada para o parâmetro. O valor passado para o parâmetro edgecolor segue o mesmo padrão do parâmetro color. Assim podemos usar cores triplas, quadruplas, com nomes definidos ou níveis de cinza.
Exemplo
import matplotlib.pyplot as plt
from numpy.random import randn, rand

a = randn(100, 2)

plt.scatter(a[:,0], a[:,1], color = '1.0', edgecolor = '0.0')

plt.show()
O exemplo acima deve resulta num gráfico parecido com esse:


Nesse exemplo, passamos o valor do parâmetro edgecolor em níveis de cinza. Mas você poderia usar outros modos para definir a cor da borda dos pontos.
Uma coisa importante de se notar é que o parâmetro edgecolor só existe na função scatter.