MATLAB Answers

Chris
0

Pre-determine plot ranges?

Asked by Chris
on 21 Aug 2019
Latest activity Commented on by Chris
on 23 Aug 2019
Given two vectors of the same length is there a way to determine the axes ranges that would result if the data were plotted without plotting the data?
I am looking to update xlim and ylim manually after the plotted data is changed* but with out relying on the automatic resizing as there are other things plotted that I dont want to be used in determining the plot ranges. Also I would rather not redraw the entire figure with just the modified data then redraw the larger thing.
(plotted data is changed*: I am manipulating the XData and YData parameter of plotted data directly with a handle.)

  0 Comments

Sign in to comment.

Products


Release

R2019a

1 Answer

Adam Danz
Answer by Adam Danz
on 21 Aug 2019
Edited by Adam Danz
on 21 Aug 2019
 Accepted Answer

If vector1 and vector1 are the x and y values to be plotted, the xlim and ylim for a tight axis would be,
xlim([min(vector1), max(vector1)]);
ylim([min(vector2), max(vector2)]);
If you'd like to access those values from the line object handle 'h',
xlim([min(h.XData), max(h.XData)]);
ylim([min(h.YData), max(h.YData)]);
If you'd like to add 5% of the data range on each side so your max and min data points are not on the axis edges,
xlim([min(x),max(x)] + [-1,1]*.05*range(x))
ylim([min(y),max(y)] + [-1,1]*.05*range(y))

  4 Comments

Show 1 older comment
Adam Danz
on 21 Aug 2019
The 3rd block of code in my answer will add a buffer around your data so the axes are not "tight". If you'd like to take that a step further and make sure the axis limits begin and end at a certain interval (like multiples of 0.5) you easily round those limits.
Here's a demo.
int = 0.5;
xl = [floor(min(x)/int)*int,ceil(max(x)/int)*int];
yl = [floor(min(y)/int)*int,ceil(max(y)/int)*int];
xlim(xl)
ylim(yl)
Adam Danz
on 21 Aug 2019
Your proposal requires that an axis already exists. If you want to base "int" from my solution on the axis tick interval,
int = mean(diff(get(gca,'xtick')));
xl = [floor(min(x)/int)*int,ceil(max(x)/int)*int];
Chris
on 23 Aug 2019
yep good edit. initilization wont be a problem and the changed data points will be of the same magnitude so reusing tick should work.

Sign in to comment.