Universidade do Estado do Rio de Janeiro
Instituto de Química
Prof André Luís Alberton
Índice

Gráficos¶

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.

In [1]:
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.

In [2]:
# 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
Out[2]:
[<matplotlib.lines.Line2D at 0x2979290be20>]

Cores¶

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.

Exemplo - plotar cores¶

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.

In [3]:
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')

Marcadores¶

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

Exemplo - plotar marcadores¶

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

In [4]:
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')

Linhas¶

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.

In [5]:
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.

Legendas¶

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.

In [6]:
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)
Out[6]:
<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.

Eixos¶

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.

In [7]:
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')

Subplots¶

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 axsconterá 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.

In [8]:
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


Manipulação dos eixos¶

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

In [9]:
# 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')
Out[9]:
Text(0, 0.5, 'w')

Aumentar dimensão e espaçamento entre gráficos¶

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.

In [10]:
# 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()