Python - Gráficos com Matplotlib

A biblioteca matplotlib é usada para construir gráficos em Python. Neste material, ela será útil para visualizar funções, pontos de interpolação, ajustes de regressão, áreas aproximadas por integração e soluções numéricas de equações diferenciais.

O uso mais comum é importar o módulo pyplot com o apelido plt. Em geral, combinamos NumPy para gerar os pontos e Matplotlib para desenhar o gráfico.

Plotagem 2D

A plotagem 2D é usada quando queremos representar pares ordenados \((x,y)\). Ela aparece em gráficos de funções reais, pontos de interpolação, curvas ajustadas por regressão e soluções aproximadas de EDOs do tipo \(y(x)\).

import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return x**2 - 4

x = np.linspace(-3, 3, 100)
y = f(x)

plt.plot(x, y)
plt.axhline(0, color="black", linewidth=0.8)
plt.grid(True)
plt.show()

Gráfico 2D da função x ao quadrado menos 4

No exemplo, np.linspace(-3, 3, 100) cria 100 pontos no intervalo \([-3,3]\). Quanto maior a quantidade de pontos, mais suave será a curva desenhada.

Comando Função no gráfico 2D
plt.plot(x, y) Desenha uma curva ligando os pontos \((x_i,y_i)\)
plt.scatter(x, y) Desenha pontos sem ligá-los por linhas
plt.grid(True) Mostra a grade do plano cartesiano
plt.show() Exibe a figura na tela
plt.savefig("grafico.png") Salva a figura em um arquivo de imagem

Gráfico com pontos e legenda

Em interpolação e regressão, é comum comparar pontos observados com uma curva calculada. Para isso, podemos desenhar os pontos com scatter e a curva com plot:

import numpy as np
import matplotlib.pyplot as plt

x_dados = np.array([0, 1, 2, 3], dtype=float)
y_dados = np.array([1, 2.8, 5.2, 10.1], dtype=float)

def modelo(x):
    return x**2 + 1

x = np.linspace(0, 3, 100)
y = modelo(x)

plt.scatter(x_dados, y_dados, label="Dados")
plt.plot(x, y, label="Modelo")
plt.xlabel("x")
plt.ylabel("y")
plt.title("Comparação entre dados e modelo")
plt.legend()
plt.grid(True)
plt.show()

Gráfico 2D comparando pontos de dados e curva do modelo

Os comandos xlabel, ylabel, title e legend tornam o gráfico mais legível. Eles devem ser usados sempre que o gráfico for apresentado como resultado de um método numérico.

Plotagem 3D

A plotagem 3D é usada quando cada ponto depende de três coordenadas, como \((x,y,z)\), ou quando queremos visualizar uma superfície \(z=f(x,y)\). Esse tipo de gráfico é útil para interpretar funções de duas variáveis, superfícies de erro e trajetórias espaciais.

Para desenhar uma superfície, primeiro criamos uma malha de pontos no plano \(xy\) com np.meshgrid. Depois calculamos \(z\) em cada ponto dessa malha:

import numpy as np
import matplotlib.pyplot as plt

def f(x, y):
    return x**2 + y**2

x = np.linspace(-2, 2, 50)
y = np.linspace(-2, 2, 50)

X, Y = np.meshgrid(x, y)
Z = f(X, Y)

fig = plt.figure()
ax = fig.add_subplot(projection="3d")

ax.plot_surface(X, Y, Z, cmap="viridis")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
ax.set_title("Superfície z = x² + y²")

plt.show()

Gráfico 3D da superfície z igual a x ao quadrado mais y ao quadrado

Nesse exemplo, X e Y guardam as coordenadas da malha, e Z guarda o valor da função em cada ponto. O comando plot_surface desenha a superfície correspondente.

Comando Função no gráfico 3D
np.meshgrid(x, y) Cria uma malha de pontos no plano \(xy\)
fig.add_subplot(projection="3d") Cria um eixo tridimensional
ax.plot_surface(X, Y, Z) Desenha uma superfície
ax.plot3D(x, y, z) Desenha uma curva no espaço
ax.scatter(x, y, z) Desenha pontos tridimensionais

Atividade

Construa um gráfico 2D para \(f(x)=x^2+1\) no intervalo \([0,2]\). Depois, construa uma superfície 3D para \(z=x^2+y^2\) usando np.meshgrid e plot_surface.