Subplots, axes labels and mouse events.

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Subplots, axes labels and mouse events.

Éric Depagne

Hi all,

 

I have a figure which consists of three subplots, which I have defined as follows:

gs = gridspec.GridSpec(2, 2)

self.ax1 = plt.subplot(gs[0:, 0])

self.ax2 = plt.subplot(gs[1])

self.ax3 = plt.subplot(gs[3])

self.ax1.imshow(self.data, vmin=self.dataminzs, vmax=self.datamaxzs)

self.ax1.figure.canvas.mpl_connect('motion_notify_event', self._on_move)

 

The _on_move() callback is (currently) defined as:

def _on_move(self, event):

if event.inaxes:

ax = event.inaxes # the axes instance

print('data coords %s %f %f' % (ax, event.xdata, event.ydata))

 

 

I want that when I hover the mouse over ax1 then ax2 and ax3 show the part of ax1 which is under the cursor, with 2 different levels of zooms.

 

I want to limit the region where the _on_move() is called to ax1 and I struggle to get what I want.

 

I thought that calling

self.ax1.figure.canvas.mpl_connect('motion_notify_event', self._on_move)

would limit the area of my figure where the mouse event are caught to ax1, but it's not the case. I see that even.inaxes is

picking that I'm on different part of the figure, the

 

print('data coords %s %f %f' % (ax, event.xdata, event.ydata))

 

shows different values for ax depending on where the mouse is over the figure

 

 

So I thought that I might be checking the attributes of event.inaxes to make sure I do what I need to do only when the mouse is over ax1, but it seems that all the attributes of the Axes are not passed to the _on_move() callback.

 

self.ax1.set_label('AX1') sets the ax1 label as expected, but if I test the event.inaxes.properties() in my _on_move(), then the label attribute is not set anymore.

 

 

Is there a way to make sure the _on_move() is fired only on a specific area of my figure?

 

Any help appreciated.

 

Thanks.

 

Éric.

 

 

--

Un clavier azerty en vaut deux

----------------------------------------------------------

Éric Depagne

 


_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Subplots, axes labels and mouse events.

Éric Depagne

Le dimanche 21 janvier 2018, 04:00:47 SAST Éric Depagne a écrit :

Hi all,

 

Not sure what I did wrong yesterday, but it seems that

self.ax1.set_label('AX1')

Indeed sets the label properly, and I can test that in the _on_move()

 

Sorry for the noise.

 

Éric.

 

 

> Hi all,

>

> I have a figure which consists of three subplots, which I have defined as

> follows: gs = gridspec.GridSpec(2, 2)

> self.ax1 = plt.subplot(gs[0:, 0])

> self.ax2 = plt.subplot(gs[1])

> self.ax3 = plt.subplot(gs[3])

> self.ax1.imshow(self.data, vmin=self.dataminzs, vmax=self.datamaxzs)

> self.ax1.figure.canvas.mpl_connect('motion_notify_event', self._on_move)

>

> The _on_move() callback is (currently) defined as:

> def _on_move(self, event):

> if event.inaxes:

> ax = event.inaxes # the axes instance

> print('data coords %s %f %f' % (ax, event.xdata, event.ydata))

>

>

> I want that when I hover the mouse over ax1 then ax2 and ax3 show the part

> of ax1 which is under the cursor, with 2 different levels of zooms.

>

> I want to limit the region where the _on_move() is called to ax1 and I

> struggle to get what I want.

>

> I thought that calling

> self.ax1.figure.canvas.mpl_connect('motion_notify_event', self._on_move)

> would limit the area of my figure where the mouse event are caught to ax1,

> but it's not the case. I see that even.inaxes is

> picking that I'm on different part of the figure, the

>

> print('data coords %s %f %f' % (ax, event.xdata, event.ydata))

>

> shows different values for ax depending on where the mouse is over the

> figure

>

>

> So I thought that I might be checking the attributes of event.inaxes to make

> sure I do what I need to do only when the mouse is over ax1, but it seems

> that all the attributes of the Axes are not passed to the _on_move()

> callback.

>

> self.ax1.set_label('AX1') sets the ax1 label as expected, but if I test the

> event.inaxes.properties() in my _on_move(), then the label attribute is not

> set anymore.

>

>

> Is there a way to make sure the _on_move() is fired only on a specific area

> of my figure?

>

> Any help appreciated.

>

> Thanks.

>

> Éric.

 

 

--

Un clavier azerty en vaut deux

----------------------------------------------------------

Éric Depagne

 


_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users