MATLAB Answers

How to draw perpendicular line from scatter points in 2-D plot

조회 수: 3(최근 30일)
Shekhar Gangal
Shekhar Gangal 2021년 6월 24일
댓글: Shekhar Gangal 2021년 6월 24일
hold on
x=[0:0.02:2]
y=sin(x.^3 - 2)
plot(x,y,'k')
a=randperm(length(x),10);
b=x(a)
z=sin(b.^3 - 2)
scatter(b,z)
i have used this code to plot a line and get 10 random scatter points on it, now i need to make perpendicular lines from those scatter points onto the x and y axis, how do i do that

채택된 답변

Adam Danz
Adam Danz 2021년 6월 24일
편집: Adam Danz 2021년 6월 24일
How to plot horizontal and vertical lines from axes to data point
clf()
ax = gca();
hold(gca,'on')
x=[0:0.02:2];
y=sin(x.^3 - 2);
plot(ax,x,y,'k')
a=randperm(length(x),10);
b=x(a);
z=sin(b.^3 - 2);
scatter(ax,b,z)
xMin = ax.XLim(1);
yMin = ax.YLim(1);
xln = plot(ax, [1;1]*b(:).', [z(:).';yMin*ones(1,numel(z))], 'c--');
yln = plot(ax, [b(:).';xMin*ones(1,numel(z))], [1;1]*z(:).', 'c--');
How to update the reference lines when axis limits change
The solution above will create lines that extend to existing axis limits. If the axis limits change due to user interaction or setting xlim/ylim, the reference line endings will not be updated.
Add the section below to automatically update the reference line endings when the axis limits change. This uses LimitsChangedFcn which was introduced in Matlab R2021a.
ax.XAxis.LimitsChangedFcn = @(axh,data)updateRefLines(data, yln, 'x');
ax.YAxis.LimitsChangedFcn = @(axh,data)updateRefLines(data, xln, 'y');
function updateRefLines(data,h,xy)
% Responds to LimitsChangedFcn by updating the line endpoints in
% h (handles to line objs) to the new axis limits in data.
% Axis that changed is identified by 'xy'.
if strcmpi(xy,'x')
% xlim changed, update the y-data
coordinates = vertcat(h.XData);
coordinates(:,1) = data.NewLimits(1);
set(h, {'XData'}, mat2cell(coordinates,ones(size(h)),2))
else
% ylim changed, update x-data
coordinates = vertcat(h.YData);
coordinates(:,1) = data.NewLimits(1);
set(h, {'YData'}, mat2cell(coordinates,ones(size(h)),2))
end
end
  댓글 수: 3
Adam Danz
Adam Danz 2021년 6월 24일
I've updated my answer by moving ax=gca() above your code and by applying the axis handle, ax, to your plotting functions. Specifying axis handles, or 'parents' is best-practice and something you sould adopt as a newbie.
I also agree with John's advice about variable names, of course.
Even better than ax=gca() is to specify the parent of the axes using
fig = figure();
ax = axes(fig);
gca() 'get current axes' should be avoided when possible since it will assign the current axis handle which may not be the axis handle you're working with. By using the 2 lines above, you completely control the objects and where they are assigned.

댓글을 달려면 로그인하십시오.

추가 답변(1개)

John D'Errico
John D'Errico 2021년 6월 24일
I would STRONGLY recommend you learn to use descriptive variable names. a? b? z?
MATLAB does not charge more for you to use two or, god forbid, even three letter names. Even more are possible, or so I hear. But the use of descriptive variable names will make your code possible to debug, when your code becomes longer and far more complex.
hold on
x=[0:0.02:2];
y=sin(x.^3 - 2);
plot(x,y,'k-')
a=randperm(length(x),10);
b=x(a);
z=sin(b.^3 - 2);
scatter(b,z)
I have no idea why you selected points as you did, as there are far easier ways to generate points randomly from an interval. (Read the help for rand.) But consider what this would do:
my_x = rand(1,10)*2;
But now, you want to generate WHAT perpendicular? Perpendicular lines to the curve? Or do you want to drop line segments from those points that are perpendicular to the x axis? Both are pretty easy, but the latter is trivial.
figure
plot(x,y,'k-')
hold on
scatter(b,z);
plot([b;b],[-ones(size(z));z],'-r')
  댓글 수: 2
Shekhar Gangal
Shekhar Gangal 2021년 6월 24일
nevermind, i figured it out, plus i also realized the imp of xlim and ylim

댓글을 달려면 로그인하십시오.

태그

제품


릴리스

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by