Finding Curve Intersections with Zero
In Python, obtaining exact y-axis values from a plot can be challenging when the value is not a whole number. This article addresses this issue and presents a solution based on linear interpolation.
Given two arrays (vertical_data and gradient(temperature_data)), a plot is generated using plt.plot. However, the plot displays a y-value that is close to but not exactly zero.
Linear Interpolation for Root Estimation
To estimate the exact root of a numpy array, a simple linear interpolation method can be used. The following code demonstrates how to find the zero values of an arbitrary curve:
<code class="python">import numpy as np def find_roots(x, y): s = np.abs(np.diff(np.sign(y))).astype(bool) return x[:-1][s] + np.diff(x)[s]/(np.abs(y[1:][s]/y[:-1][s])+1) x = .4+np.sort(np.random.rand(750))*3.5 y = (x-4)*np.cos(x*9.)*np.cos(x*6+0.05)+0.1 z = find_roots(x,y) plt.plot(x,y) plt.plot(z, np.zeros(len(z)), marker="o", ls="", ms=4)</code>
This code identifies the roots of the curve and plots them as circles at the exact y-value of zero.
Non-Zero Intercepts
The same approach can be used to find the intersection of a curve with any non-zero y-value (y0) by modifying the line that finds the roots:
<code class="python">z = find_roots(x,y-y0)</code>
Two Curve Intersections
The linear interpolation method can also be used to find the intersection between two curves. By finding the roots of the difference between the two curves, we can estimate their intersection point:
<code class="python">y2 = (x - 2) * np.cos(x * 8.) * np.cos(x * 5 + 0.03) + 0.3 z = find_roots(x,y2-y1) plt.plot(x,y1) plt.plot(x,y2, color="C2") plt.plot(z, np.interp(z, x, y1), marker="o", ls="", ms=4, color="C1")</code>
The above is the detailed content of How to Find Exact Zero and Non-Zero Intercepts on Plots Using Linear Interpolation in Python?. For more information, please follow other related articles on the PHP Chinese website!