Curva suave do gráfico Matplotlib
-
Traçar curva suave utilizando a
scipy.interpolate.make_interp_spline()
Classe -
Curva Suave do Lote Utilizando o
scipy.ndimage.gaussian_filter1d()
Classe -
Curva suavada utilizando a classe
scipy.interpolate.interp1d
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ç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 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:
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:
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.