# Identifying x value at y on an xy plot

6 views (last 30 days)
Hannah Douglas on 21 Nov 2019
Commented: Star Strider on 21 Nov 2019
I have a fairly simple problem that I imagine has a simple solution. I have a plot in which the x-axis represents a location (0-8) and the y-axis is the probability of a certain action occuring at that location. I need to identify the x value when there is a 50% chance of the action happening. Example data below.
x = [0,1,2,3,4,5,6,7,8];
y = [0,0,0,.25,.25,.25,.75,1,1];
plot(x,y);
line([0,8],[.5,.5]);
I just need to identify the x value when y is 0.5. Is there a simple solution I am missing here? Thank you!

Star Strider on 21 Nov 2019
A common problem interpolating y-values that are not unique is how to make them appropriate for interpolation. One way is to simply choose a small range of data in the vicinity of the desired interpolation point.
Try this:
x = [0,1,2,3,4,5,6,7,8];
y = [0,0,0,.25,.25,.25,.75,1,1];
idx = find(y <= 0.5, 1, 'last'); % Select Small Range Of Data Based On Desired Interpolation Point
idxrng = [0 1]+idx;
Lxq = interp1(y(idxrng), x(idxrng), 0.5, 'linear'); % Interpolate Over Small Range Of Data
Pxq = interp1(y(idxrng), x(idxrng), 0.5, 'spline'); % Interpolate Over Small Range Of Data
figure
plot(x,y)
hold on
plot(Lxq, 0.5, 'p')
hold off
line([0,8],[.5,.5]);
Here the two interpolation menthods give the same result. That may not always be the situation, so specify an appropriate method.
Experiment to get different results.

Hannah Douglas on 21 Nov 2019
This solution works really well for me, thank you! So far the linear and spline interpolation produce the same value, but I'll keep them both in for comparison. Thanks
Star Strider on 21 Nov 2019
As always, my pleasure!
The linear and spline methods produce the same result in this example. However in different situations they would produce significantly different results, the reason I recommend always specifying a method to get the desired result. (The linear method is the default with interp1.)

dpb on 21 Nov 2019
P=0.5; % P to find
iy=find(y>P,1); % first point past P
xp=interp1(y(iy-1:iy),x(iy-1:iy),P); % interpolate between prior point and point
You'll have problem where your proability points are identical between observations, though.