Philip (view profile)

on 25 Feb 2011
Latest activity Edited by Michelle Hirsch

on 9 Oct 2019

Michelle Hirsch (view profile)

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!

Paulo Silva

Paulo Silva (view profile)

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

Michelle Hirsch (view profile)

on 29 Jan 2016
Edited by Michelle Hirsch

Michelle Hirsch (view profile)

on 9 Oct 2019

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:e
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

on 8 Jul 2014

line([x x], [y1 y2]); is the easy command;

Ryuji Segawa

Ryuji Segawa (view profile)

on 29 Sep 2016
you are a genius!
Bin Miao

on 5 Dec 2017
Thanks!
Claire Flashman

on 11 Feb 2018
Thank you!

carolina franco (view profile)

on 26 Oct 2017
Edited by MathWorks Support Team

MathWorks Support Team (view profile)

on 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:

Junayed Chowdhury

Junayed Chowdhury (view profile)

on 30 Jan 2018
This one works fantastically...Thanks a lot :D cheers!!
Camilo Malagon Nieto

Camilo Malagon Nieto (view profile)

on 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 (view profile)

on 28 Aug 2019
What an absolute god, thankyou

on 12 Mar 2013
Edited by Mark

Mark (view profile)

on 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).

the cyclist (view profile)

on 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])

Steven Lord (view profile)

on 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.

Chou Jerry

on 26 Apr 2019

on 28 Mar 2014
Edited by James

James (view profile)

on 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');

Steven

Steven (view profile)

on 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 (view profile)

on 9 Sep 2016
@Steven That's because undocumented features can be removed at any time, as this feature was.

Jos (10584) (view profile)

on 8 Jul 2014

You might also be interested in GRIDXY on the File Exchange:

Pedro Luis Camuñas García-Miguel (view profile)

Answer by Pedro Luis Camuñas García-Miguel

Pedro Luis Camuñas García-Miguel (view profile)

on 13 Apr 2018

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.

Walter Roberson

Walter Roberson (view profile)

on 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

on 8 May 2018
Thanks!

Julian Williams (view profile)

on 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.