[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