Curva suave de la parcela Matplotlib

Suraj Joshi 30 enero 2023
  1. Trazar la curva suave usando la clase scipy.interpolate.make_interp_spline()
  2. Trazar una curva suave usando la clase scipy.ndimage.gaussian_filter1d()
  3. Trazar una curva más suave usando la clase scipy.interpolate.interp1d
Curva suave de la parcela Matplotlib

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:

Trazar una curva suave usando la función make_interp_spline()

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:

Curva trazada usando los puntos dados

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:

Trazar la curva suave usando la función gaussian_filter1d()

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:

Trazar una curva suave usando la Interpolación Cúbica

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 avatar Suraj Joshi avatar

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

LinkedIn