[Matplotlib-users] Efficiency in connecting two subplot.

Benjamin Root ben.v.root at gmail.com
Mon Feb 19 10:04:28 EST 2018


You might want to consider not having the limits change at *every* mouse
motion over the axes. You can add a function state variable and maybe have
it refresh every other motion or so.

```
    def _on_move(self, event):
        zoom1 = 100
        if event.inaxes:

            ax = event.inaxes  # the axes instance
            if 'AX1' in ax.get_label():
                _on_move.counter += 1
                if _on_move.counter % 2:
                    return
                # Mouse is in subplot 1.
                xinf2 = np.int(event.xdata - zoom1)
                xsup2 = np.int(event.xdata + zoom1)
                yinf2 = np.int(event.ydata - zoom1)
                ysup2 = np.int(event.ydata + zoom1)
                ax2data = self.data[yinf2:ysup2, xinf2:xsup2]
                self.plt2.set_data(ax2data)
                self.ax2.figure.canvas.draw()
    _on_move.counter = 0
```
Another approach could be done where you capture the timestamp of when this
function was last used for updating the limits, and only do a new limit
update if a certain amount of time passed, such as half a second or so.

Cheers!
Ben Root


On Mon, Feb 19, 2018 at 9:37 AM, Éric Depagne <eric at depagne.org> wrote:

> Le vendredi 16 février 2018, 21:41:07 SAST vincent.adrien at gmail.com a
> écrit :
> Hi Adrien,
>
> Thanks for the answer, I'll have a look and will try to get things working
> a
> bit more efficiently.
>
> Cheers,
> Éric.
> > Hi Éric,
> >
> > I am not very used to play with interactive events, but I guess some
> > blitting could help you with performance:
> > -
> > https://stackoverflow.com/questions/29277080/efficient-
> matplotlib-redrawing
> > -
> > https://matplotlib.org/users/event_handling.html#draggable-
> rectangle-exercis
> > e (see the extra credit example)
> >
> > See the attached script that is inspired from your code and seems to
> > less stress my CPU.
> >
> > Hopefully this helps.
> >
> > Best,
> > Adrien
> >
> > On 02/16/2018 01:36 AM, Éric Depagne wrote:
> > > Hi all,
> > >
> > > I have a gridspec plot and one of the subplot is a zoom on the part
> over
> > > which the mouse hovers on another subplot.
> > >
> > > It works, but I think the way I implemented it is not very efficient,
> > > since each time I use it, I see one CPU go to 100%.
> > > Here is the code that does implement the zoom. Any idea on how to make
> it
> > > (more) efficient or changes that I should implement welcome.
> > >
> > > Thanks.
> > >
> > > def plot(self):
> > >          gs = gridspec.GridSpec(6, 2)
> > >          ax1 = plt.subplot(gs[1:, 0])
> > >          plt1 = ax1.imshow(self.data, vmin=self.dataminzs,
> > >          vmax=self.datamaxzs)
> > >          ax1.set_label('AX1')
> > >          self.ax2 = plt.subplot(gs[0:3, 1])
> > >          zoomeddata = self.data[np.int(self.data.shape[0]/
> > >
> > > 2)-50:np.int(self.data.shape[0]/2)+50, np.int(self.data.shape[1]/
> > > 2)-50:np.int(self.data.shape[1]/2)+50]
> > >
> > >          self.plt2 = self.ax2.imshow(zoomeddata, vmin=self.dataminzs,
> > >
> > > vmax=self.datamaxzs)
> > >
> > >          ax1.figure.canvas.mpl_connect('motion_notify_event',
> > >          self._on_move)
> > >
> > >      def _on_move(self, event):
> > >          zoom1 = 100
> > >
> > >          if event.inaxes:
> > >              ax = event.inaxes  # the axes instance
> > >
> > >              if 'AX1' in ax.get_label():
> > >                  # Mouse is in subplot 1.
> > >                  xinf2 = np.int(event.xdata - zoom1)
> > >                  xsup2 = np.int(event.xdata + zoom1)
> > >                  yinf2 = np.int(event.ydata - zoom1)
> > >                  ysup2 = np.int(event.ydata + zoom1)
> > >                  ax2data = self.data[yinf2:ysup2, xinf2:xsup2]
> > >                  self.plt2.set_data(ax2data)
> > >                  self.ax2.figure.canvas.draw()
>
>
> --
> Un clavier azerty en vaut deux
> ----------------------------------------------------------
> Éric Depagne
>
>
> _______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users at python.org
> https://mail.python.org/mailman/listinfo/matplotlib-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/matplotlib-users/attachments/20180219/e8270994/attachment-0001.html>


More information about the Matplotlib-users mailing list