View License

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video

Highlights from

Join the 15-year community celebration.

Play games and win prizes!

» Learn more

4.9 | 7 ratings Rate this file 17 Downloads (last 30 days) File Size: 11.3 KB File ID: #41426 Version: 1.9
image thumbnail




22 Apr 2013 (Updated )

Zooming and panning with the mouse in 2D plots. Supports plotyy, loglog, subplot, etc.

| Watch this File

File Information

allows direct zooming and panning with the mouse in 2D plots.
Default mouse button functions (can be customized, see below):
               Scroll wheel: zoom in/out
     Left Mouse Button: select an ROI rectangle to zoom in
 Middle Mouse Button: pan view
   Right Mouse Button: reset view to default view
   akZoom(handles, mButtons_ZoomPanReset)
   akZoom() activates mouse control for all axes-objects in the current figure.
   akZoom(handles) activates mouse control for the axes given by handles.
     handles can be:
     a) a single axis handle.
     b) an array of axis handles. In this case all axes will be linked,
        i.e. panning and zooming in one of the axes will affect the others as well.
     c) a cell array consisting of axis handles and/or arrays of axis
        handles. In this case mouse control is activated for all axes inside
        the cell but linking is only activated for axes in a common array.
     d) one of the following strings:
        i) 'all': activates mouse control for all axes in all open figures.
            The axes will not be linked except for axes belonging to the same
            plotyy plot.
        ii) 'all_linked': activates mouse control for all axes in all open
            figures and links all axes.
   akZoom(handles, mButtons_ZoomPanReset) and akZoom(mButtons_ZoomPanReset)
     will use akZoom with customized mouse buttons.
     mButtons_ZoomPanReset can be:
     'lmr', 'lrm', 'mlr', 'mrl', 'rlm' or 'rml'
     where the letters stand for the buttons left, middle and right.
     So 'lmr' means left=ROI-zoom, middle=pan and right=reset.
     Note: If you want to use a certain mouse button pattern as default,
     just change mButtons_ZoomPanReset_default in the "Settings" section

 %% Simple Plot
 %% Subplots (independent axes)
     for k = 1:4
       y = rand(1,15);
       subplot(2, 2, k);

 %% Subplots (mixture of linked and indipendent axes)
     ax = NaN(4,1);
     for k = 1:4
       y = rand(1,15);
       ax(k) = subplot(2, 2, k);

 %% Different figures (linked)
     ax1 = gca;
     ax2 = gca;

 %% More examples in the file "akZoom_examples.m"

   Axes linked manually with linkaxes() are unlinked by akZoom
   Solve this in the future by:
   h = getappdata(h_ax, 'graphics_linkaxes');
   linked_axes = h.Targets; ...

 Author: Alexander Kessel
 Affiliation: Max-Planck-Institut für Quantenoptik, Garching, München
 Contact : alexander.kessel <at>
 Revision: 02. August 2015

 - Rody P.S. Oldenhuis for his mouse_figure function which served as the
   template for akZoom
 - Benoit Botton for reporting on an issue with axes nested in GUIs


Mouse Friendly Figure inspired this file.

This file inspired Ui Signal Builder2 and Image Manipulation Toolbox.

Required Products MATLAB
MATLAB release MATLAB 8.5 (R2015a)
MATLAB Search Path
/Wrapper for Matlab plot functions
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (17)
12 Oct 2016 useruser

The wrappers can be simplified using builtin function. For example:

function h = plot(varargin)
% wrapper for the original plot function
h = builtin('plot', varargin{:});

The support for vertical/horizontal zoom (like in 2016b, if ROI is very close to a vertical or horizontal line respectively), would be nice.

Comment only
14 Sep 2016 Alexander Kessel

@Anne-Sophie Girard-Guichon: Thanks for tracking and fixing this bug. I included your correction in the new submission.

@DGM: Thanks for your comment. I'm afraid there is not much I can do regarding the imshow-function: akZoom does actually fill the parent axis. The problem is that imshow() sets the parent axes to fit the image in the first place with the DataAspectRatio setting.
A workaround is to use image() instead and fix the aspect ratio by "axis equal". This way the original axes size is preserved. Here is a comparison:

img = imread('peppers.png');

set(gcf, 'Position', [500,600,400,150]);
set(gcf,'Name', 'imshow()', 'NumberTitle', 'off')

set(gcf, 'Position', [500,350,400,150]);
set(gca, 'DataAspectRatio', [1 1 1])
set(gca, 'visible', 'off')
set(gcf,'Name', 'DataAspectRatio [1 1 1] (same as imshow)', 'NumberTitle', 'off')

set(gcf, 'Position', [500,100,400,150]);
axis equal
set(gca, 'visible', 'off')
set(gcf,'Name', 'axis equal', 'NumberTitle', 'off')

Comment only
19 Jul 2016 DGM

So far everything works correctly and quickly. This makes me wish it were just the default view control behavior. Perhaps the only thing missing in that regard would be functionality to force IMSHOW/IMAGE to fill its parent axes when zooming in.

Otherwise I think you just ended several hours worth of frustration for me.

Comment only
30 Mar 2016 Anne-Sophie Girard-Guichon

Hi Alexander,

You did a very good job. Thanks for sharing it.

However, I had an issue when fast scrolling for a zoom in, it was actually zooming out !

My quick fix was (line 208 in akZoom.m):

zoomFactor = (abs(sc)*(1+wheel_zoomFactor/100))^sign(sc);

instead of

zoomFactor = abs(sc)*(1+wheel_zoomFactor/100)^sign(sc);

I added parentheses, otherwise abs(sc) is not taken into account if sign(sc) is negative, which was giving me a zoom factor > 1 (zoom out).

28 Jan 2016 chen xinfeng

It's good and work nice. The demo is clear.

08 Sep 2015 Alexander Kessel

Hi Astrolix,

Thanks for the notification! I simply forgot to add plotyy_fixZoom to the zip-folder. Sorry for that.

The file, however, you found via Google is correct and should do the job (at least it does on my R2009b and R2013a).

I uploaded a version with included plotyy_fixZoom. Please report the error message if it still does not work for you.

As a workaround you can also comment out the call in my plotyy.m file. plotyy_fixZoom has nothing to do with the akZoom-functionality and just fixes a general Matlab-bug with plotyy tick-labels.

Comment only
07 Sep 2015 Astrolix

The latest version of this function/package does not work.

It is missing a file named plotyy_fixZoom(AX). I found one version of it through a google search that basically contained:

set(AX(2), 'XTickLabel','','XAxisLocation','Top')

I tried to put it in, but received an error based on the input argument, that plotyy (from this package). Next, I just pasted what plotyy_fixZoom does, and I received a "undefined function ..." on akZoom.

Comment only
02 Aug 2015 Alexander Kessel

Hi Benoit,

Thanks for pointing this error out! I fixed it in my recent update.

Comment only
29 May 2014 Benoit Botton

Hi alexander,

this is a very good piece of code, so useful. thank you for sharing.

I ran into the following issue:
in a GUI I built, my axes are within a uipanel. so I kept getting this error:
" Error using hg.uipanel/set
The name 'WindowScrollWheelFcn' is not an accessible property for an instance of class 'uipanel'. "

my quick fix was to add the following lines at the end of the parse_handles function:

for nn = 1:length(h_fig)
while ~strcmpi( get( h_fig(nn), 'Type'), 'figure')
h_fig(nn) = get(h_fig(nn), 'Parent');

some quick testing shows it works

10 Dec 2013 Alexander Kessel

Hi Vincent,
Thanks for your idea. It should be feasible. I'll think about including it in the next release.

Comment only
04 Dec 2013 Vincent

Is it easy to add the feature with linked glasses to only keep x linking. So that you can pan/zoom in a subplot and only the x limits in the other linked subplots change?

Comment only
05 Nov 2013 arnold

arnold (view profile)

great stuff!
Always wonder why Mathworks can't seem to manage to include such "basic" functionality, puzzling.

09 Oct 2013 Shahab

Shahab (view profile)

08 Oct 2013 Alexander Kessel

Hi Francesco,
Thanks for the feedback. I just uploaded the next version which will be published as soon as the MathWorks team has finished reviewing it.

Regarding the zoom/pan bug: Yes I have the same problem and on the way for a solution I found that many people have similar issues of loosing window focus after some operation. Sometimes they could find a workaround for this Matlab behaviour but for the case where you delete a patch object (like in akZoom) I couldn't find a solution. However, I wanted to get rid of the patch object anyway, so I replaced it with a rectangle: voilà!

Regarding customizing the mapping of the mouse buttons: you can do this now easily in the "Settings" section of the akZoom function. I guess everyone has a certain scheme he/she wants to work with but there is no need to change this really at runtime. Correct me if I'm wrong.

Comment only
06 Oct 2013 Francesco Montorsi

Thanks for this useful submission!
Just one problem I've found so far on my MATLAB r2013a: after a zoom by left-click (zoom by creating a rectangle), I cannot used anymore the scroll wheel to zoom in or out... do you have the same issue?

Also it would be very nice to allow the caller to specify the mapping of the mouse buttons: e.g., I would like to pan with the left mouse button and to zoom by a rectangle with the middle button... I can modify that in the code myself, but having the function configurable at runtime would be nice IMHO :)

16 Jun 2013 Alexander Kessel

Hi Felix,

Thanks for your comment and rating!

What you could do is to create a wrapper for the MATLAB-plot function:

function h = myPlot(varargin)
h = plot(varargin{:});

Save this function in a folder of your choice and add it to the Matlab-Search-Path.

Now you can use the function myPlot the same way you would use "plot" and akZoom is included automatically.

Comment only
12 Jun 2013 Felix

Felix (view profile)

thanks, works very well!
I wonder, is there a way to automatically have it run for every plot, without typing akZoom every time...

07 May 2013 1.3

*out-of-the-box functionality with subplots and (multiple) plotyy-axes
*arbitraty linking between different axes can be easily set up

08 Oct 2013 1.5

-zooming: replaced patch by rectangle -> faster, visually not dependent on renderer, bug fixed that prevented scroll wheel events after zoom
-mapping of mouse buttons can be customized
-easy usage with 'all' and 'all_linked' (works now with plotyy)

09 Oct 2013 1.6

updated Description

04 Nov 2013 1.7

*supports now loglog & semilog
*mouse buttons customizable
*unsensitive to data markers & legends
*checks for valid axis limits (log!)
*automatically callable for 2D plots

02 Aug 2015 1.8

* solved problems with axes nested in GUIs (thanks to Benoit Botton)
* solved problems with out-of bounds logarithmic-plots
* improved error handling in wrapper functions
* bugfix for fast scrolling (could previously result in error messages )

08 Sep 2015 1.8.1

included missing file: plotyy_fixZoom.m

14 Sep 2016 1.9

fix a bug that occurs when fast scrolling with mouse wheel (thanks to Anne-Sophie Girard-Guichon)

Contact us