MATLAB Answers

Adding vertical line to plot?

조회 수: 9,915(최근 30일)
Hi there,
Can anyone please tell me how I can add a vertical line to my plot at a specified sample point? For example, I have a a 1x41 vector of intensity values, and I would like to add a vertical line on the center sample (sample number 21).
Many thanks!

  댓글 수: 1

Paulo Silva
Paulo Silva 25 Feb 2011
fig=figure;
hax=axes;
x=0:0.1:10;
hold on
plot(x,sin(x))
SP=1; %your point goes here
line([SP SP],get(hax,'YLim'),'Color',[1 0 0])

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

채택된 답변

Michelle Hirsch
Michelle Hirsch 29 Jan 2016
편집: Michelle Hirsch 2 Apr 2020
Woohoo - this is built into MATLAB now, as of R2018b! You can use xline and yline to create lines with constant x or y values respectively.
Basic usage couldn't be much easier:
If you are on older releases, another option is hline and vline from the File Exchange: http://www.mathworks.com/matlabcentral/fileexchange/1039-hline-and-vline

  댓글 수: 2

John D'Errico
John D'Errico 2 Apr 2020
There is one thing that frustrates me about yline and xline (I do love them, don't get me wrong.)
A standard MATLAB paradigm has always been that if you don't have a return argument, then none is returned, at least from functions that return handles. For example,
>> plot(rand(5),'.')
>>
Returns nothing. However, if I wish to get the handle, then I can. Just specify a return argument. Essentially, plot checks nargout before it exits.
H = plot(1:5)
H =
Line with properties:
Color: [0 0 1]
LineStyle: '-'
LineWidth: 0.5
Marker: 'none'
MarkerSize: 6
MarkerFaceColor: 'none'
XData: [1 2 3 4 5]
YData: [1 2 3 4 5]
ZData: [1×0 double]
Show all properties
This is compeltely standard behavior in MATLAB. ANY function that returns a graphics handle has always operated that way.
HOWEVER, xline and yline fail to follow that standard paradigm. They ALWAYS return a handle to the line as created.
xline(2)
ans =
ConstantLine with properties:
InterceptAxis: 'x'
Value: 2
Color: [0.15 0.15 0.15]
LineStyle: '-'
LineWidth: 0.5
Label: ''
DisplayName: ''
Show all properties
Some of the time it is useful to get the handle. But if I want it, then I can always grab it as an output argument. Would it have been that difficult to check to see if an output argument was requested? All the authors of xline and yline needed to do was one simple check at the end of the code:
if nargout == 0
clear YL % or whatever is the internal name of the handle variable
end
My point is, MATLAB functions should ALWAYS be consistent in how they work.
I should never need to remember to add a semi-colon after calls to functions like xline and yline to kill the spurious and unwanted graphics handle being dumped to the command window. Essentially, I consider this a bug in the code of those two functions.
Jairo Domech
Jairo Domech 8 May 2020
this code is nice thank you guys.

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

추가 답변(10개)

Muhammad
Muhammad 8 Jul 2014
line([x x], [y1 y2]); is the easy command;

  댓글 수: 4

표시 이전 댓글 수: 1
Bin Miao
Bin Miao 5 Dec 2017
Thanks!
Claire Flashman
Claire Flashman 11 Feb 2018
Thank you!
Christian Sanchez
Christian Sanchez 8 May 2020
Genial

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


carolina franco
carolina franco 26 Oct 2017
편집: MathWorks Support Team 8 Nov 2018
You can plot a horizontal or vertical line using the “plot” function with this pattern:
- Horizontal line:
plot([x1 x2],[y y])
- Vertical line:
plot([x x],[y1 y2])
For example, plot a vertical line at x = 21. Set the y values using the y-axis limits of the axes.
y = ylim; % current y-axis limits
plot([21 21],[y(1) y(2)])
As Steven suggested, starting in R2018b, you can use the “xline” and “yline” functions instead. For more information, see:

  댓글 수: 3

Junayed Chowdhury
Junayed Chowdhury 30 Jan 2018
This one works fantastically...Thanks a lot :D cheers!!
Camilo Malagon Nieto
Camilo Malagon Nieto 19 Mar 2018
This is AMAZING!!! because it makes the line automatically covering the data area of the plot. So I do not need to do extra work of finding where the line should start and should end. It works for several different plots that had diferent y-axis ranges.
Edward Manson
Edward Manson 28 Aug 2019
What an absolute god, thankyou

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


Mark
Mark 12 Mar 2013
편집: Mark 12 Mar 2013
Probably the simplest way:
Choose the x-value where you want the line "xval." Choose the minimum y value to be displayed on your graph "ymin" and the maximum y value to be displayed on your graph "ymax."
x=[xval,xval];
y=[ymin,ymax];
plot(x,y)
Flaws with this method: probably will look silly if you use '-x' or '-.', these mark your specific points on the line, but you'll only have two (at least they're endpoints).

  댓글 수: 0

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


the cyclist
the cyclist 25 Feb 2011
One way:
figure
x = rand(1,41);
y = 1:41;
plot(x,y,'r.');
line([x(21) x(21)],[0 41]);
set(gca,'YLim',[0 41])

  댓글 수: 0

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


Steven Lord
Steven Lord 1 Nov 2018
If you're using release R2018b or later, use the xline or yline functions to create lines with constant x or y values respectively.

  댓글 수: 1

Gary Bikini
Gary Bikini 26 Apr 2019
Best answer!

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


James
James 28 Mar 2014
편집: James 28 Mar 2014
There is an excellent answer over on http://stackoverflow.com/a/8108766/1194420 repeated below for convenience. ---
There exist an undocumented function graph2d.constantline:
plot(-2:5, (-2:5).^2-1)
%# vertical line
hx = graph2d.constantline(0, 'LineStyle',':', 'Color',[.7 .7 .7]);
changedependvar(hx,'x');
%# horizontal line
hy = graph2d.constantline(0, 'Color',[.7 .7 .7]);
changedependvar(hy,'y');

  댓글 수: 2

Steven
Steven 6 Apr 2015
Why is there no documentation on this function? It works great but it is difficult to motivate putting undocumented methods in code that I share with others.
Ben
Ben 9 Sep 2016
@Steven That's because undocumented features can be removed at any time, as this feature was.

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


Pedro Luis Camuñas García-Miguel
Maybe it is a bit late but I want to contribute, there is a really easy way to add vertical and horizontal lines, you just have to use a hold and then overlap them over the main plot.
Before declaring the original plot, add a hold on to ensure it will retain both plots, then plot the lines, with this structure:
hold on;
plot(the main function)
plot([x x],[0 y_max]) % Vertical Line
plot([o x_max],[y y]) % Horizontal line
Being:
x: location on horizontal axis where you place the vertical line.
y: location on vertical axis where you place the horizontal line.
x_max: point where you want the vertical line to end.
y_max: point where you want the horizontal line to end.
I hope this was useful to whoever consults this page.

  댓글 수: 2

Walter Roberson
Walter Roberson 23 Apr 2018
If you use line() instead of plot() then you do not need the "hold". line() is one of the primitives that always adds to the current plot; it is the "high level plotting routines" that clear the current axes before plotting and need the "hold"
Pedro Luis Camuñas García-Miguel
Thanks!

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


Jos (10584)
Jos (10584) 8 Jul 2014
You might also be interested in GRIDXY on the File Exchange:

  댓글 수: 0

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


Julian Williams
Julian Williams 9 Feb 2019
Small additional suggestion, say you want to label your line in the legend so that it has some meaning, or take advantage of some of the easy to use options in plot, then using "hold", the ylim from the current axis and the "repmat" is very useful. You can also make multiple vertical lines with some spacing using this technique.
figure
% make some sort of illustration
T = 1000;
A = 0.7;
h = [];
Y = cumsum(sqrt(0.05).*randn(T,1));
X = (1:T)./T;
I = find(X>A);
Y(I) = Y(I(1));
h(1) = plot(X,Y,'-k','linewidth',2);
hold on
dims = get(gca,'ylim');
yy = linspace(dims(1),dims(2),100);
xx = repmat(A,1,100);
h(2) = plot(xx,yy,':r','linewidth',2);
dims = get(gca,'xlim');
xx = linspace(dims(1),dims(2).*A,100);
yy = repmat(Y(I(1)),1,100);
h(3) = plot(xx,yy,':b','linewidth',2);
grid on
G = legend(h,'Particle Motion','Stopping Point','Stopped Value');
set(G,'location','best','interpreter','latex');
Just a thought.

  댓글 수: 0

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


Adrian Peters
Adrian Peters 8 Feb 2020
Sorry, but what does (-2:5).^2-1 do? I dont know, how to calculate the ^2-1.

  댓글 수: 2

Walter Roberson
Walter Roberson 8 Feb 2020
-2:5 is the list of values -2 -1 0 1 2 3 4 5 . The .^2 squares each element of the list giving you 4 1 0 1 4 9 16 25 . Then you subtract 1 from each giving you 3 0 -1 0 3 8 15 24
Adrian Peters
Adrian Peters 8 Feb 2020
Now it makes sense to me! Thank you a lot!

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

Community Treasure Hunt

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

Start Hunting!

Translated by