Problem using ginput to reposition axes

7 views (last 30 days)
Hi. I am working on a function that lets you interactively reposition an axes (for example a subplot) using the mouse input. This is my attempt (simplified a bit) for one axes
%create invisible axes covering the figure
drawax = axes('Position',[0, 0, 1, 1],'Visible','off');
[left, bottom] = ginput(1); %get position
[top, right] = ginput(1);
newpos = [left, bottom, max(0,right-left), max(0,top-bottom)];
ax1.Position = newpos; %ax1 is the subplot that is to be repositioned.
[left, bottom] return the correct positions, but [top, right] seem to be returning coordinates from ax1. Is there a way I can force ginput to select points that correspond with the normalized position of drawax?
  2 Comments
Geoff Hayes
Geoff Hayes on 31 Jan 2016
Marc - please clarify what you mean by reposition an axes. Are you just trying to zoom in on a particular area and so are trying to reset the x and y axis limits?
Marc Jakobi
Marc Jakobi on 1 Feb 2016
In Matlab figures, there's always a white border around the axes when you save it. Cropping bitmap images to remove the border is quite simple, but it gets a lot more complicated when you want to export the figure to the emf format. Just using "export setup..." and "expand axes to fill figure" often results in the plots getting distorted (especially when you have multiple axes on top of each other per subplot - as in plotyy or when you copy an axes in order to create a second legend). My function tries to do this automatically taking into account various factors (amount of ylabels, colorbars, and axes per subplot, amount of subplots, etc.). I managed to get it to crop pretty much all figures for emf export that I have tested it on, but just in case it encounters a figure that it crops incorrectly, I am trying to implement a manual mode, in which it does the automatic cropping, highlights the subplots one by one and lets the user manually select the bottom left and top right corner of each subplot in order to correct the "crop". For this, I would like to implement an option using ginput() and one in which it displays the new position and queries a corrected position from the user via input (each correction occuring in a loop until the user is satisfied with the crop). I believe the ginput() method would make it a little easier for users who have little experience with the normalized position [left, bottom, width, height] vectors of axes. However, I can't seem to get it to return normalized coordinates relative to the position of the axes, which is what I need for the manual axes expansion.

Sign in to comment.

Accepted Answer

Image Analyst
Image Analyst on 31 Jan 2016
Perhaps call xlim() and ylim() to find out your "field of view" in your graph, then call ginput(1) to find a desired center of the graph, then, based on that, compute new limits for the displayed x and y ranges, then call xlim() and ylim() to assign them to the graph.
  5 Comments
Image Analyst
Image Analyst on 1 Feb 2016
You can just accept this one. Thanks! Glad it worked out for you.

Sign in to comment.

More Answers (0)

Categories

Find more on Creating, Deleting, and Querying Graphics Objects in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!