how can I plot several vertical lines in graph?

335 views (last 30 days)
Stephen
Stephen on 25 Sep 2016
Commented: Liam Booth on 12 Oct 2020
I would like to plot vertical lines at several specified points (x axis) on a graph. Each point is the onset of a stimulus. I specify the number of these points and where they occur with the following:
stimulus = zeros([1 20]);
prompt = ['how many stimuli in this experiment? '];
stimnumber = input(prompt);
for stim=1:stimnumber
query=['when is onset of stim number ',num2str(stim)];
disp(query);
prompt = '? ';
stimulus(1,stim)=input(prompt);
end
This sets up an array ("stimulus") with up to 20 stimulus points I can specify.
Now how can I access "stimulus" to draw the vertical lines? I was able to do this with with a super klugey script such as:
y = [0 5];
x = [stimulus(1,1), stimulus(1,1)];
plot(x,y,'Color','b');
x = [stimulus(1,2), stimulus(1,2)];
plot(x,y,'Color','b');
x = [stimulus(1,3), stimulus(1,3)];
plot(x,y,'Color','b');
.
.
.
%%and so forth up to
x = [stimulus(1,20), stimulus(1,20)];
plot(x,y,'Color','b');
Surely there is a cleaner way to do this with a for loop, but I just can't get it.
Any help?
Here's what it should look like, for instance if I specify 3 stimuli at x=300,400, and 450:

Accepted Answer

Star Strider
Star Strider on 25 Sep 2016
If ‘stimulus’ is a row vector, this may do what you want:
stimulus = rand(1, 10);
figure(1)
plot([stimulus; stimulus], repmat(ylim',1,size(stimulus,2)), '-k')
  2 Comments
Star Strider
Star Strider on 25 Sep 2016
My pleasure!
I noticed that in the code you posted, you don’t use either the figure (creates new figure window) or hold (keeps the current figure window open for plotting) functions.
The problem is that your code as you posted it will overwrite earlier plots with subsequent ones.
If you’re having problems seeing everything you want to on your plots, see the documentation on figure and hold.

Sign in to comment.

More Answers (2)

Image Analyst
Image Analyst on 25 Sep 2016
Try line()
line([x, x], ylim, 'Color', 'b', 'LineWidth', 2);
where x is a single value. If you have a bunch and want to do it all in one call, use stem() and turn the markers off.
stem(x, y, 'MarkerFaceColor', 'none', 'MarkerEdgeColor', 'none', 'LineWidth', 2);
  1 Comment
Stephen
Stephen on 25 Sep 2016
Thanks, Image Analyst. I'll try this and Star Strider's method below.

Sign in to comment.


Adam Danz
Adam Danz on 10 Sep 2020
Edited: Adam Danz on 10 Sep 2020
In Matlab r2018b or later, you can use xline() (yline for horizontal lines).
Option 1: Loop through each value in x
% x is a vector|array of x-values
h = gobjects(size(x));
for i = 1:numel(x)
h(i) = xline(x(i));
end
Option 2: use an array function
% x is a vector|array of x-values
h = arrayfun(@(a)xline(a),x);
Specify the line style or add a line label using the 2nd and 3rd inputs xline(xvalue,LineSpec,label).
  3 Comments
Liam Booth
Liam Booth on 12 Oct 2020
Stephen is obviously a dedicated MATLAB enthusiast!

Sign in to comment.

Categories

Community Treasure Hunt

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

Start Hunting!