Para gráficos, há uma série de pacotes disponíveis. Vamos usar o clássico matplotlib.pyplot
, geralmente referenciado como plt
. Para tanto é necessário instalá-lo e importá-lo.
import matplotlib.pyplot as plt
Um gráfico pode então ser gerado informando-se listas de dados para os valores de x e y, respectivamente. Vejamos um exemplo.
# escrita de dados, sequências x,y
x = [1,2,3,4,5,6]
y = [3,4,5.2,4,3,0]
plt.plot(x,y,'bo') # gera um gráfico com marcadores em círculo
# escrita de dados, sequências w
w = [5,2,3,4.1,1,1]
plt.plot(x,w,'r--') # gera um gráfico com linha tracejada
[<matplotlib.lines.Line2D at 0x2979290be20>]
As cores básicas (os nomes foram deixados em inglês) são referenciadas como:
cor | símbolo |
---|---|
blue | b |
green | g |
red | r |
cyan | c |
magenta | m |
yellow | y |
black | k |
white | w |
No exemplo a seguir, são plotadas as cores básicas do matplotlib
.
O procedimento seguir imprime uma retângulo com cada uma das cores básicas do python ['b','g','r','c','m','y','k','w']
, cada uma com com largura de $ bx = 0.001 $ e altura $ by=0.65 $. Ela escreve um texto dentro da caixa com o nome da cor (em inglês). Para a cor branca if lista_cores='w'
, imprime várias linhas pretas para que a escrita em branco possa aparecer.
lista_cores = ['b','g','r','c','m','y','k','w']
nome_cores = ['blue','green','red','cyan','magenta','yellow','black','white']
n_cores = len(lista_cores)
bx = 0.001
x = [0,bx,bx,0,0]
by = 0.65
for i in range(n_cores):
y = [i,i,i+by,i+by,i]
if lista_cores[i]=="w":
for j in range(400):
xaux = [bx/400*j,bx/400*j]
yaux = [i,i+by]
plt.plot(xaux,yaux,'k-')
txt = ' '
txt = txt.join([' ', lista_cores[i],' - ', nome_cores[i]])
plt.text(bx/4,i+.1,txt,fontsize = 15,color=lista_cores[i])
plt.plot(x,y,lista_cores[i])
plt.axis('off')
A lista de marcadores pode ser encontrada no tutorial do matplotlib. A tabela a seguir apresenta alguns dos principais marcadores.
Simbolo | Marcadores | Descrição |
---|---|---|
o | ● |
círculo (letra o) |
$$*$$ | $$ * $$ | asterisco |
s | ■ |
quadrado |
p | ⬟ |
pentágono |
h | ⬡ |
hexágono |
P | ➕ |
"mais" preenchido |
O procedimento seguir imprime a lista de marcadores do pyton ['.',',','o','v','^','<','>','1','2','3','4','8','s','p','h','H','+','x','D','|','_','*']
, com seus símbolos associados
lista_marcadores=['.',',','o','v','^','<','>','1','2','3','4','8','s','p','h','H','+','x','D','|','_','*']
#lista_marcadores.reverse()
n = len(lista_marcadores)
desloc = .2*(n+1)/2
ycol = 0
for i in range(n):
if i<=n/2:
ycol = 0
x = 1
else:
x = 1.02
ycol = -desloc
y = ycol + .2*i
txt = ''
txt=lista_marcadores[i]
plt.plot(x,y,txt)
plt.text(x+.005,y-.05,lista_marcadores[i],fontsize = 15)
plt.axis('off')
Novamente, no tutorial do matplotlib estão apresentados os detalhes sobre tipos de linhas de gráficos. As linhas que recebem nomes específicos são ['solid', 'dotted', 'dashed', 'dashdot']
. No comando de plotar, pode-se informar o nome do tipo de linha, conforme segue:
plt.plot(x,y,linestyle='dashdot')
No exemplo a seguir, são ilustrados os quatro tipos de linhas nomeados no matplotlib
.
linhas = ['solid', 'dotted', 'dashed', 'dashdot']
n = len(linhas)
for i in range(n):
x = [0,1]
y = [i,i]
plt.plot(x,y,linestyle=linhas[i])
Outros tipos de linhas são disponíveis na forma parametrizada.
Uma das formas de se inserir legendas consiste em nomear cada sequência com um nome na propriedade label
. Depois, informamos a posição, que podem ser as seguintes (tutorial do matplotlib)
Posição | Descrição |
---|---|
best | melhor posição que menos se sobrepõe aos gráficos, segundo critério do matplotlib |
upper right | direita superior |
upper left | esquerda superior |
upper center | centro superior |
lower right | direita inferior |
lower left | esquerda inferior |
right center | direita centro |
left center | esquerda centro |
center | centro |
Considere o exemplo.
x = [1,2,3,4]
y = [2,-1,3,6]
w = [0,3,1,3]
plt.plot(x,y,label='a')
plt.plot(x,w,label='b')
plt.legend(loc='best', frameon=False)
<matplotlib.legend.Legend at 0x2979467cfd0>
Várias personalização são possíveis (veja por exemplo este site). Modificações das posições das legendas e propriedades podem ser consultadas no tutorial do matplotlib.
Os eixos podem ser nomeados e ter suas propriedades modificadas conforme a necessidade (ex, neste site).
plt.xlabel('nome do eixo', fontweight='bold', color = 'blue', fontsize='20')
A mudança das propriedades dos eixos pode ser feita com o comando abaixo (tutorial do matplotlib).
plt.tick_params(axis ='x', which ='major', labelsize = 18, pad = 12, colors ='r')
Vejamos um exemplo.
x = [1,2,3,4]
y = [2,-1,3,6]
w = [0,3,1,3]
plt.plot(x,y,label='a')
plt.xlabel('x',fontweight = 'bold',color='blue',fontsize=20)
plt.ylabel('y',fontweight = 'heavy',color='red',fontsize=20)
plt.tick_params(axis ='x', which ='major', labelsize = 18, pad = 12, colors ='r')
plt.tick_params(axis ='y', which ='major', labelsize = 16, pad = 12, colors ='b')
Para geração de subplots, definimos:
fig, axs = plt.subplots(nº de linhas,nº de colunas)
A variável fig
conterá proriedades da figura geral; enquanto a lista axs
conterá propriedades de cada um dos subplots(axs[i][j]
conterá propriedades da figura da posição da linha i
e da coluna j
).
Considere o exemplo a seguir.
Exemplo
Gere gráficos (3 linhas e 2 colunas), e escreva no gráfico o número do gráfico.
fig, axs = plt.subplots(3, 2)
k = 0
for i in range(3):
for j in range(2):
k=k+1
axs[i][j].text(0.2,0.5,'gráfico '+str(k),color='red',fontsize=16)
Fim do exemplo
Para manipular eixos específicos, primeiro precisamos criá-los. Isto é feito usando o comando set_xlabel, set_ylabel, set_zlabel
para os eixos (x,y,z), respectivamente. Após criados, podemos modificar suas propriedades. Vamos ver um exemplo.
Exemplo
Para a sequência de dados a seguir, plote as sequências [x,y]
em um gráfico e [x,w]
em outro gráfico e manipule as propriedades dos eixos.
a =5;b = 20; n = 30;
dx = (b-a)/(n-1)
x = list(a+i*dx for i in range(n))
y = list(xi/(1+xi) for xi in range(n))
w = list(xi**2/(1+xi) for xi in range(n))
Solução
# Geração de dados x, y, w
a =5;b = 20; n = 30;
dx = (b-a)/(n-1)
x = list(a+i*dx for i in range(n))
y = list(xi/(1+xi) for xi in range(n))
w = list(xi**2/(1+xi) for xi in range(n))
# Geração dos subplots
fig, axs = plt.subplots(1,2)
# manipulação do primeiro
axs[0].plot(x,y)
axs[0].set(xlabel='')
axs[0].set_xlabel('x',fontweight = 'bold',fontsize=16,color='b')
axs[0].set(ylabel='')
axs[0].set_ylabel('y',fontweight = 'bold',fontsize=16,color='r')
# Geração de outro subplot
axs[1].plot(x,w)
axs[1].set_xlabel('x',fontweight = 'bold',fontsize=16,color='g')
axs[1].set(ylabel='')
axs[1].set_ylabel('w',fontweight = 'bold',fontsize=16,color='m')
Text(0, 0.5, 'w')
O comando mantém um espaçamento .tight_layout() mantém um autoajuste de espaçamento entre os gráficos.
Para redimensionar a figura, podemos usar o comando de fig.set_figheight(), fig.set_figwidth()
para modificar altura e largura, respectivamente.
Vejamos o exemplo anterior acrescentando-se este comando.
Exemplo
Refaça o exemplo anterior, redimensionando a figura global e garantindo espaçamento entre as subfiguras.
# Geração de dados x, y, w
a =5;b = 20; n = 30;
dx = (b-a)/(n-1)
x = list(a+i*dx for i in range(n))
y = list(xi/(1+xi) for xi in range(n))
w = list(xi**2/(1+xi) for xi in range(n))
# Geração dos subplots
fig, axs = plt.subplots(1,2)
# manipulação do primeiro
axs[0].plot(x,y)
axs[0].set(xlabel='')
axs[0].set_xlabel('x',fontweight = 'bold',fontsize=16,color='b')
axs[0].set(ylabel='')
axs[0].set_ylabel('y',fontweight = 'bold',fontsize=16,color='r')
# Geração de outro subplot
axs[1].plot(x,w)
axs[1].set_xlabel('x',fontweight = 'bold',fontsize=23,color='g')
axs[1].set(ylabel='')
axs[1].set_ylabel('w',fontweight = 'bold',fontsize=23,color='m')
fig.set_figheight(5)
fig.set_figwidth(12)
fig.tight_layout()