Curva suave de la parcela Matplotlib
-
Trazar la curva suave usando la clase
scipy.interpolate.make_interp_spline()
-
Trazar una curva suave usando la clase
scipy.ndimage.gaussian_filter1d()
-
Trazar una curva más suave usando la clase
scipy.interpolate.interp1d
Este tutorial explica cómo podemos trazar una curva suave a partir de unas coordenadas dadas usando los módulos del paquete Scipy
y Matplotlib.
La función matplotlib.pyplot.plot()
por defecto produce una curva uniendo dos puntos adyacentes en los datos con una línea recta, y por lo tanto la función matplotlib.pyplot.plot()
no produce una curva suave para un pequeño número de puntos de datos.
Para trazar una curva suave, primero ajustamos una curva spline a la curva y usamos la curva para encontrar los valores de y para los valores de x separados por una brecha infinitesimal. Finalmente, obtenemos una curva suave trazando esos puntos con una brecha muy pequeña.
Trazar la curva suave usando la clase scipy.interpolate.make_interp_spline()
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()
Producción:
Traza una curva spline suave determinando primero los coeficientes de la curva spline usando el scipy.interpolate.make_interp_spline()
. Utilizamos los datos dados para estimar los coeficientes de la curva spline y luego usamos los coeficientes para determinar los y-valores de los x-valores estrechamente espaciados para hacer la curva suave. Se necesitan 500
espaciados por igual entre 1 y 7 a lo largo del eje X para trazar la curva.
Por defecto, el grado de la curva spline es 3. Podemos establecer el parámetro k
para cambiar el grado de la curva spline.
Si usamos los puntos dados para trazar la curva, obtenemos la 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()
Producción:
Trazar una curva suave usando la clase scipy.ndimage.gaussian_filter1d()
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()
Producción:
Si la función no es suave, podemos usar el gaussian_filter1d()
para hacer que los valores Y
sean suaves. La clase scipy.ndimage.gaussian_filter1d()
alisará los valores Y
para generar una curva suave, pero los valores Y
originales podrían cambiar.
El parámetro sigma
representa la desviación estándar del núcleo gaussiano y obtenemos una curva más suave al aumentar el valor de sigma
.
Trazar una curva más suave usando la clase 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()
Producción:
Genera una curva de interpolación cúbica usando la clase scipy.interpolate.interp1d
, y luego usamos la curva para determinar los valores-y para los valores-x poco espaciados para una curva suave. Para trazar la curva, se necesitan 500 puntos espaciados igualmente entre 1 y 7 a lo largo del eje X.
Suraj Joshi is a backend software engineer at Matrice.ai.
LinkedIn