"Restore View" limits come from... where?
Mostrar comentarios más antiguos
I'm having some difficulty with a plot in Matlab 2018b. After plotting the data, I select the "Zoom In" option from the axes menu on the top-right, and zoom in and out to inspect the data. I later select "Restore View" from the context menu available when using "Zoom In", expecting it to go back to what it was after I plotted the data. However, I end up with a blank white axes with XLim [0 1]. (Legitimate X limits would be along the lines of [7.3705e+05 7.3740e+05].) Manually setting the X limits reveals that my data plots are still there, but well out of view.
My question is: Where is Matlab getting the limits that should be used when performing "Restore View"?
If needed, here's some more detailed information:
I am using a stack of two axes, directly overlaid on top of each other, inside of a graphics panel. The two axes are linked on the X-axis ("linkaxes([a,b],'x');"). The "upper" axes are set to have no background color, and "PickableParts" has been set to none.
2 comentarios
Walter Roberson
el 1 de Mzo. de 2019
It has been a while since I looked at that code. I have a half memory of noting that the portion dealing with restoring from linked axes was a bit messy and looked like it would be prone to error.
I seem to recall that when the plot is rendered in an axes that has a modal behavior manager active on it, that the XLim and YLim properties are stored as UserData (might have been AppData), and that Restore View pulls those values out... at least in the simple non-linked case.
Sean Mahnken
el 2 de Mzo. de 2019
Respuesta aceptada
Más respuestas (1)
Since this thread is in the top search results for linkaxes as well, here is a related article for linkaxes from MathWorks: https://www.mathworks.com/matlabcentral/answers/426098-zoom-auto-doesn-t-work-with-linkaxes-when-data-is-replaced
So for linkaxes, the easiest solution is to restore the auto mode for Lim:
% ax is an Axes array
% link x axes of all plots
linkaxes(ax,'x');
% reset XLimMode back to auto to properly "Restore View" when data is
% exchanged
[ax.XLimMode] = deal('auto');
In other cases, Walter is right. Here some more information.
From my info, "Restore View" finally triggers
resetplotview
which is an internal function. A more common function to restore the view is
zoom out;
For R2021a, the appdata change can be seen in localResetPlotView():
edit(fullfile(matlabroot, 'toolbox', 'matlab', 'graphics', 'resetplotview.m'))
So basically, the standard view of an axes can be found with
getappdata(ax)
And as Walter suggested, look for "zoom_zoomOrigAxesLimits". If it is not set, the axes view has not yet been modified by zoom/pan. Changing the limit property also doesn't set a "Restore View" point.
To manually set the "Home" zoom of an axes (https://www.mathworks.com/matlabcentral/answers/345743-how-can-i-change-the-default-original-view-that-a-figure-resets-to-when-i-double-click-inside-the-fi), use
zoom reset;
To delete the "Home" zoom of an axes (https://www.mathworks.com/matlabcentral/answers/23318-reset-to-original-view-with-zoom), use
resetplotview(ax,'InitializeCurrentView');
% or possibly remove the zoom data fields:
rmappdata(ax, 'zoom_zoomOrigAxesLimits');
rmappdata(ax, 'matlab_graphics_resetplotview');
Categorías
Más información sobre Creating, Deleting, and Querying Graphics Objects en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!