Pular para o conteúdo

PyPlot

O PyPlot é um módulo da biblioteca matplotlib para criação de gráficos.

Exemplos

  • Exemplo: Apresenta uma linha entre pontos (x, y). A linha é vermelha (‘r’) e tem largura 3 vezes a largura padrão.
from matplotlib import pyplot as plt
x=[1,2,3,4]
y=[10,20,30,50]
plt.title('Exemplo de uma linha com pyplot')
plt.plot(x, y, 'r', label = 'linha única', linewidth=3)
plt.legend()
plt.xlabel('Eixo X')
plt.ylabel('Eixo Y')
plt.show()

A saida do programa é mostrada abaixo.

  • Exemplo: Mostra duas linhas que usam as mesmas coordenadas x. A primeira linha é vermelha (‘r’), cada ponto é marcado com um quadrado (‘s’) e os pontos são ligados por uma linha contínua (‘-‘). A segunda linha é azul (‘b’), cada ponto é marcado com um círculo (‘o’) e os pontos são ligados por uma linha desenhada por ‘-.’. Note que foram alteradas as características dos labels da figura como, por exemplo, o tamanho da fonte. Além disso, foi definido que a legenda das linhas deveria aparecer centralizada no topo da figura.
from matplotlib import pyplot as plt
x=[1,2,3,4]
y1=[10,20,30,50]
y2=[50,30,20,10]
plt.title('Exemplo de linhas com pyplot', fontsize=20, fontweight="bold", color="orange")
plt.plot(x, y1, 'rs-', label = 'linha 1', linewidth=2)
plt.plot(x, y2, 'bo-.', label = 'linha 2', linewidth=2)
plt.legend(loc='upper center')
plt.xlabel('Eixo X', fontsize=18)
plt.ylabel('Eixo Y', fontsize=18)
plt.show()

A figura gerada pelo programa é apresentada a seguir.

  • Exemplo: Mostra três círculos com diferentes características. O primeiro círculo tem como ponto central as coordenadas (0.5, 0.5), raio de 0.3 e cor padrão azul. O segundo círculo tem coordenadas (0.4, 0.2), raio de 0.2 e cor vermelha. O terceiro círculo tem coordenadas (0.7, 0.8), raio de 0.15 e é definido por uma linha laranja de largura 3 (não é preenchido).
import matplotlib.pyplot as plt
figure, axes = plt.subplots()
circulo1 = plt.Circle((0.5, 0.5), 0.3)
circulo2 = plt.Circle((0.4, 0.2), 0.2, color="red")
circulo3 = plt.Circle((0.7, 0.8), 0.15, fill=False, color="orange", linewidth=3)

axes.set_aspect(1)
axes.add_artist(circulo1)
axes.add_artist(circulo2)
axes.add_artist(circulo3)
plt.title('Teste de Círculos', fontsize=24, fontweight="bold", color="orange")
plt.show()

Abaixo o desenho gerado pelo programa.

  • Exemplo: O programa plota as funções seno e cosseno de -360 a 360 graus. Em primeiro lugar, é criado uma lista com o método “arrange()” da biblioteca numpy. O método “radians()” da biblioteca math calcula os valores de -360o e 360o em radianos que define os valores inicial e final da lista com incremento de 0.1. Em seguida as funções sin() e cos() são usadas para gerar os valores do eixo Y do gráfico.
import matplotlib.pyplot as plt
import numpy as np
import math

x = np.arange(math.radians(-360), math.radians(360), 0.1)
y = np.sin(x)
z = np.cos(x)

plt.plot(x,y, color="blue", linewidth=3)
plt.plot(x,z, color="red", linewidth=2)
plt.xlabel('radianos', fontsize=16)
plt.ylabel('sen(x) e cos(x)', fontsize=16)
plt.title('Gráfico de seno e cosseno', fontsize=18, fontweight="bold", color="orange")
plt.legend(['sen(x)', 'cos(x)'])
plt.show()

O resultado produzido pelo programa é mostrado abaixo.

  • Exemplo: Apresenta um gráfico de barras com os maiores artilheiros do Botafogo.
from matplotlib import pyplot as plt
artilheiros = ["40tinha","Carvalho","Garrincha","Heleno","Nilo","Jarizinho"]
gols = [313,261,245,209,190,189]
plt.bar(artilheiros,gols,color="Black") #plt.barh cria barras horizontais
plt.ylabel("Gols")
plt.xlabel("artilheiros")
plt.title("Maiores artilheiros do Botafogo")
plt.show()

A saída é

É possível definir uma cor para cada barra usando uma lista.

plt.bar(artilheiros,gols,color=["black", "blue", "yellow", "green", "violet", "orange"])

A nova saída do programa é

O uso de um conjunto (color={“black”, “blue”, “yellow”, “green”, “violet”, “orange”}) no lugar da lista faz com que as cores sejam escolhidas de forma aleatória.

  • Exemplo: Apresenta as médias das notas de três disciplinas nas provas P1, P2 e P3.
from matplotlib import pyplot as plt
import numpy as np

notas_DPW = [6,9,8]
notas_TP1 = [4,7,6]
notas_MT = [6,8,8]
#Largura de barra
barWidth = 0.3
r1 = np.arange(len(notas_DPW))
r2 = [x + barWidth for x in r1]
r3 = [x + barWidth for x in r2]
#aumentar tamanho
plt.figure(figsize=(10,5))
#Criar barras
plt.bar(r1, notas_DPW,color='red',width=barWidth,label="DPW")
plt.bar(r2, notas_TP1,color='green',width=barWidth,label="TP1")
plt.bar(r3, notas_MT,color='blue',width=barWidth,label="Matemática")
#legendas
plt.xlabel('Disciplinas')
plt.ylabel("Notas")
plt.xticks([r + barWidth for r in range(len(notas_DPW))],["P1","P2","P3"])
plt.legend()
plt.show()

Abaixo o gráfico obtido.

  • Exemplo: Usa o gráfico no formato de pizza para mostrar a participação dos alunos de quatro cursos em um questionário. No total 103 alunos participaram.
from matplotlib import pyplot as plt
label = 'Engenharia','Nutrição','Matemática','História'
sizes = [31,22,10,40]

figl,axl=plt.subplots()
axl.pie(sizes,labels=label,autopct='%1.2f%%',shadow=True,startangle=0)
axl.axis('equal')
plt.title('Respostas do questionário', fontsize=20, fontweight="bold")
plt.show()

O gráfico produzido é mostrado abaixo.

O parâmetro “shadow=True” adiciona uma sombra ao gráfico, enquanto o parâmetro “startangle” indica onde começa a primeira fatia da pizza.

Portanto, para um ângulo de 90 graus, temos

É possível deslocar um ou mais pedaços da pizza com o parâmetro “explode“. Por exemplo, para enfatizar a primeira fatia do exemplo acima, pode-se usar

distancia = [0.2, 0, 0, 0]
axl.pie(sizes,labels=label,autopct='%1.2f%%',shadow=True,explode=distancia,startangle=0)

O gráfico resultante da alteração é mostrado abaixo.

  • Exemplo: A partir da informação das idades de várias pessoas, o programa calcula quantas pessoas exitem em uma determinada faixa de idade. Os dados são divididos em 10 faixas (ou bins). Cada faixa tem largura 0.9 (isto significa que existirá uma pequena separação entre as barras).
from matplotlib import pyplot as plt 
idades=[65, 26, 67, 50, 47, 73, 1, 58, 2, 94, 12, 22, 12, 95, 25, 13, 61, 41, 24, 95, 3, 71, 53, 24, 23, 44, 83, 30, 19, 32, 71, 66, 45, 6, 99, 4, 76, 27, 50, 18, 58, 61, 53, 72, 14, 78, 36, 89, 6, 71, 58, 69, 22, 34, 38, 51, 71, 83, 22, 22, 36, 44, 16, 58, 20, 49, 28, 55, 21, 26, 23, 41, 21, 95, 18, 63, 55, 2, 61, 81, 39, 20, 39, 17, 66, 60, 73, 26, 54, 16, 76, 83, 9, 12, 15, 35, 54, 11, 7, 61]
plt.title('Idades de um grupo',fontsize=20)
plt.xlabel('Idade')
plt.ylabel('Frequência Absoluta')
plt.hist(idades,10,rwidth=0.9)
plt.show()

O programa gera o gráfico abaixo. Note que a faixa com maior quantidade de pessoas está entre 21 e 31 anos.

Se o parâmetro “density=True” for definido, os pesos são normalizados de modo que cada faixa representa um percentual. Assim, é possível comparar o histograma com a distribuição normal (usando a média e o desvio padrão dos dados fornecidos).

plt.hist(idades,10,rwidth=0.9,density=True)

import numpy
from scipy.stats import norm

med = numpy.mean(idades)
dp  = numpy.std(idades)
min = numpy.min(idades)
max = numpy.max(idades)
x = numpy.linspace(min, max, 100)
y = norm.pdf(x, med, dp)  
plt.plot(x, y, color="red", linewidth=3)

plt.show()

A nova imagem gerada é mostrada a seguir.

  • Exemplo: Plota a distribuição normal com média igual a 4 e desvio padrão igual a 2. Uma parte da área do gráfico é coberta com azul. O método “savefig()” é usado para armazenar o gráfico gerado no arquivo “normal.png”.
from scipy.stats import norm
import scipy.stats
import numpy as np
import matplotlib.pyplot as plt

# Parâmetros
media = 4
dp = 2
x_inicio = -2
x_fim = 10
pt1 = 3
pt2 = 6

# Plota gráfico
fig, ax = plt.subplots(figsize=(12, 10))
x = np.arange(x_inicio, x_fim, 0.00001)
ax.plot(x, norm.pdf(x, scale=dp, loc=media), 'r-', lw=5)

# Preenche área com azul
plt.plot([pt1 ,pt1 ],[0.0, scipy.stats.norm.pdf(pt1 ,media, dp)], color='lightblue')
plt.plot([pt2 ,pt2 ],[0.0, scipy.stats.norm.pdf(pt2 ,media, dp)], color='lightblue')
ptx = np.linspace(pt1, pt2, 100)
pty = scipy.stats.norm.pdf(ptx, media, dp)
plt.fill_between(ptx, pty, color='lightblue')

# Define parâmetros do gráfico
plt.xlim(x_inicio, x_fim)
plt.ylim(0, 0.25)
x_ticks = [-2, 0, 2, 4, 6, 8, 10]
ax.set_xticks(x_ticks)
y_ticks = [0, 0.05, 0.10, 0.15, 0.20, 0.25]
ax.set_yticks(y_ticks)
ax.set_yticklabels(["0", "0,05", "0,10", "0,15", "0,20", "0,25"])
plt.xlabel("x", fontsize="24")
plt.ylabel("f(x)", fontsize="24")
plt.tick_params(labelsize=20)
plt.tick_params(labelsize=20)
plt.savefig("normal.png")

Abaixo o gráfico gerado.