# Adding vertical line to plot?

5.277 views (last 30 days)

Show older comments

Philip
on 25 Feb 2011

##### 1 Comment

Paulo Silva
on 25 Feb 2011

Edited: Jan
on 29 Jan 2018

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

### Accepted Answer

Michelle Hirsch
on 28 Apr 2022

Edited: MathWorks Support Team
on 28 Apr 2022

Woohoo - this is built into MATLAB now, as of R2018b!

If you are running R2018b or later, you can use the “xline” and “yline” functions. For example, create a vertical line at x=5:

xline(5)

Create a horizontal line at y=10:

yline(10)

Starting in R2021a, you can create multiple horizontal or vertical lines in one pass. For example, create vertical lines at x=1, x=2, and x=3:

xline([1 2 3])

If you are running R2018a or earlier, use 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)])

##### 8 Comments

Roberto Chang
on 23 Aug 2021

Hello all! do you know if this magical (awesome) feature can be done in Z axis for bar3?

### More Answers (11)

carolina franco
on 26 Oct 2017

Edited: MathWorks Support Team
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:

##### 4 Comments

Mark
on 12 Mar 2013

Edited: Mark
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).

##### 0 Comments

the cyclist
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])

##### 0 Comments

James
on 28 Mar 2014

Edited: James
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');

##### 2 Comments

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

I hope this was useful to whoever consults this page.

##### 2 Comments

Julian Williams
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.

##### 0 Comments

Adrian Peters
on 8 Feb 2020

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

##### 2 Comments

Guy Cohen
on 22 Nov 2022

You can use arrayfun

x=1:180;

figure;plot(x,sind(x)); %-- your graph

vLines=[20 40 50 120];%-- vector of lines to plot

hold on; arrayfun(@xline,vLines);%-- plot vertical lines

##### 2 Comments

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!