Curva suave do gráfico Matplotlib

Suraj Joshi 30 janeiro 2023
  1. Traçar curva suave utilizando a scipy.interpolate.make_interp_spline() Classe
  2. Curva Suave do Lote Utilizando o scipy.ndimage.gaussian_filter1d() Classe
  3. Curva suavada utilizando a classe scipy.interpolate.interp1d
Curva suave do gráfico Matplotlib

Este tutorial explica como podemos traçar uma curva suave a partir de coordenadas dadas utilizando os módulos do pacote Scipy e Matplotlib.

A função matplotlib.pyplot.plot() por defeito produz uma curva unindo dois pontos adjacentes nos dados com uma linha recta, e portanto a função matplotlib.pyplot.plot() não produz uma curva suave para um pequeno número de pontos de dados.

Para traçar uma curva lisa, primeiro encaixamos uma curva estriada na curva e utilizamos a curva para encontrar os valores y para valores x separados por um espaço infinitesimalmente pequeno. Finalmente, obtemos uma curva lisa traçando os pontos com um intervalo muito pequeno.

Traçar curva suave utilizando a scipy.interpolate.make_interp_spline() Classe

import numpy as np
from scipy.interpolate import make_interp_spline
import matplotlib.pyplot as plt

x = np.array([1, 2, 3, 4, 5, 6, 7])
y = np.array([100, 50, 25, 12.5, 6.25, 3.125, 1.5625])

model = make_interp_spline(x, y)

xs = np.linspace(1, 7, 500)
ys = model(xs)

plt.plot(xs, ys)
plt.title("Smooth Spline Curve")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

Resultado:

Traçar curva suave usando a função make_interp_spline()

Traça uma curva estriada suave, determinando primeiro os coeficientes da curva estriada utilizando a scipy.interpolate.make_interp_spline(). Utilizamos os dados fornecidos para estimar os coeficientes para a curva estriada e depois utilizamos os coeficientes para determinar os y-values para os x-values estreitamente espaçados para tornar a curva lisa. São necessários 500 igualmente espaçados entre 1 e 7 ao longo do eixo X para traçar a curva.

Por defeito, o grau da curva estriada é 3. Podemos definir o parâmetro k para alterar o grau da curva estriada.

Se utilizarmos os pontos dados para traçar a curva, obtemos a curva como:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1, 2, 3, 4, 5, 6, 7])
y = np.array([100, 50, 25, 12.5, 6.25, 3.125, 1.5625])

plt.plot(x, y)
plt.title("Curve plotted using the given points")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

Resultado:

Curva traçada utilizando os pontos dados

Curva Suave do Lote Utilizando o scipy.ndimage.gaussian_filter1d() Classe

import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import gaussian_filter1d

x = np.array([1, 2, 3, 4, 5, 6, 7])
y = np.array([100, 50, 25, 12.5, 6.25, 3.125, 1.5625])
y_smoothed = gaussian_filter1d(y, sigma=5)

plt.plot(x, y_smoothed)
plt.title("Spline Curve Using the Gaussian Smoothing")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

Resultado:

Curva suave do traçado usando a função gaussian_filter1d()

Se a função não for lisa, podemos utilizar o gaussian_filter1d() para tornar os valores Y lisos. A classe scipy.ndimage.gaussian_filter1d() irá suavizar os valores Y para gerar uma curva suave, mas os valores Y originais podem ser alterados.

O parâmetro sigma representa o desvio padrão para o kernel gaussiano e obtemos uma curva mais suave ao aumentar o valor de sigma.

Curva suavada utilizando a classe scipy.interpolate.interp1d

import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt

x = np.array([1, 2, 3, 4, 5, 6, 7])
y = np.array([100, 50, 25, 12.5, 6.25, 3.125, 1.5625])

cubic_interploation_model = interp1d(x, y, kind="cubic")
xs = np.linspace(1, 7, 500)
ys = cubic_interploation_model(xs)

plt.plot(xs, ys)
plt.title("Spline Curve Using Cubic Interpolation")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

Resultado:

Curva suave de plotagem usando a Interpolação Cúbica

Gera uma curva de interpolação cúbica utilizando a classe scipy.interpolate.interp1d, e depois utilizamos a curva para determinar os y-values para valores próximos de x-values para uma curva suave. Para traçar a curva, são necessários 500 pontos igualmente espaçados entre 1 e 7 ao longo do eixo X.

Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn