examples - plot() python
Python-matplotlib: encuentra intersección de lineplots (1)
Tengo una pregunta probablemente simple, que me mantiene en silencio desde hace un tiempo. ¿Hay una manera simple de devolver la intersección de dos conjuntos de datos graficados (no analíticos) en python matplotlib?
Para la elaboración, tengo algo como esto:
x=[1.4,2.1,3,5.9,8,9,23]
y=[2.3,3.1,1,3.9,8,9,11]
x1=[1,2,3,4,6,8,9]
y1=[4,12,7,1,6.3,8.5,12]
plot(x1,y1,''k-'',x,y,''b-'')
Los datos en este ejemplo son totalmente arbitrarios. Ahora me gustaría saber si existe una función de construcción simple que sigo perdiendo, que me devuelve las intersecciones precisas entre las dos parcelas.
Espero haber dejado en claro, y también que no me pierdo algo totalmente obvio ...
Podríamos usar scipy.interpolate.PiecewisePolynomial
para crear funciones definidas por sus datos lineales por partes.
p1=interpolate.PiecewisePolynomial(x1,y1[:,np.newaxis])
p2=interpolate.PiecewisePolynomial(x2,y2[:,np.newaxis])
Entonces podríamos tomar la diferencia de estas dos funciones,
def pdiff(x):
return p1(x)-p2(x)
y use optimize.fsolve para encontrar las raíces de pdiff
:
import scipy.interpolate as interpolate
import scipy.optimize as optimize
import numpy as np
x1=np.array([1.4,2.1,3,5.9,8,9,23])
y1=np.array([2.3,3.1,1,3.9,8,9,11])
x2=np.array([1,2,3,4,6,8,9])
y2=np.array([4,12,7,1,6.3,8.5,12])
p1=interpolate.PiecewisePolynomial(x1,y1[:,np.newaxis])
p2=interpolate.PiecewisePolynomial(x2,y2[:,np.newaxis])
def pdiff(x):
return p1(x)-p2(x)
xs=np.r_[x1,x2]
xs.sort()
x_min=xs.min()
x_max=xs.max()
x_mid=xs[:-1]+np.diff(xs)/2
roots=set()
for val in x_mid:
root,infodict,ier,mesg = optimize.fsolve(pdiff,val,full_output=True)
# ier==1 indicates a root has been found
if ier==1 and x_min<root<x_max:
roots.add(root[0])
roots=list(roots)
print(np.column_stack((roots,p1(roots),p2(roots))))
rendimientos
[[ 3.85714286 1.85714286 1.85714286]
[ 4.60606061 2.60606061 2.60606061]]
La primera columna es el valor de x, la segunda columna es el valor de y del primer factorial de Piecewise evaluado en x
, y la tercera columna es el valor de y para el segundo polinomio de Piecewise.