pick events don't work with twiny

I find that pick events are fine until I add twiny. In that case, nothing
happens when clicking.

THe code outline is like:

fig, ax = plt.subplots()
ax2 = ax.twiny()
ax.semilogy(...)
fig.canvas.mpl_connect('pick_event', onpick)
ax2_xaxis = np.linspace (*ax.get_xlim(), endpoint=True,)/conversion
ax2.semilogy (ax2_xaxis, np.ones (len(ax2_xaxis)) * 1e-3, alpha=0)
ax2.set_xlabel(...)
...

removing all the lines about ax2 will restore pick function.

The problem is that the second axes is getting the pick events, because it
is on top of the first axes. This has been a problem for a long time, and
we haven't found a good solution for it.

Ben Root

···

On Tue, Jan 30, 2018 at 10:10 AM, Neal Becker <ndbecker2 at gmail.com> wrote:

I find that pick events are fine until I add twiny. In that case, nothing
happens when clicking.

THe code outline is like:

fig, ax = plt.subplots()
ax2 = ax.twiny()
ax.semilogy(...)
fig.canvas.mpl_connect('pick_event', onpick)
ax2_xaxis = np.linspace (*ax.get_xlim(), endpoint=True,)/conversion
ax2.semilogy (ax2_xaxis, np.ones (len(ax2_xaxis)) * 1e-3, alpha=0)
ax2.set_xlabel(...)
...

removing all the lines about ax2 will restore pick function.

_______________________________________________
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/20180130/05a0d31b/attachment.html>

Benjamin Root wrote:

The problem is that the second axes is getting the pick events, because it
is on top of the first axes. This has been a problem for a long time, and
we haven't found a good solution for it.

Ben Root

That was my guess. Is there any workaround?

···

On Tue, Jan 30, 2018 at 10:10 AM, Neal Becker > <ndbecker2 at gmail.com> wrote:

I find that pick events are fine until I add twiny. In that case,
nothing happens when clicking.

THe code outline is like:

fig, ax = plt.subplots()
ax2 = ax.twiny()
ax.semilogy(...)
fig.canvas.mpl_connect('pick_event', onpick)
ax2_xaxis = np.linspace (*ax.get_xlim(), endpoint=True,)/conversion
ax2.semilogy (ax2_xaxis, np.ones (len(ax2_xaxis)) * 1e-3, alpha=0)
ax2.set_xlabel(...)
...

removing all the lines about ax2 will restore pick function.

I seem to recall someone once messing around with the zorder of the axes
object, but I forget if that actually worked. Of course the other
workaround is to make the axes with the pickable objects be the twined axes.

Ben Root

···

On Tue, Jan 30, 2018 at 11:15 AM, Neal Becker <ndbecker2 at gmail.com> wrote:

Benjamin Root wrote:

> The problem is that the second axes is getting the pick events, because
it
> is on top of the first axes. This has been a problem for a long time, and
> we haven't found a good solution for it.
>
> Ben Root
>

That was my guess. Is there any workaround?

> On Tue, Jan 30, 2018 at 10:10 AM, Neal Becker > > <ndbecker2 at gmail.com> wrote:
>
>> I find that pick events are fine until I add twiny. In that case,
>> nothing happens when clicking.
>>
>> THe code outline is like:
>>
>> fig, ax = plt.subplots()
>> ax2 = ax.twiny()
>> ax.semilogy(...)
>> fig.canvas.mpl_connect('pick_event', onpick)
>> ax2_xaxis = np.linspace (*ax.get_xlim(), endpoint=True,)/conversion
>> ax2.semilogy (ax2_xaxis, np.ones (len(ax2_xaxis)) * 1e-3, alpha=0)
>> ax2.set_xlabel(...)
>> ...
>>
>> removing all the lines about ax2 will restore pick function.
>>

_______________________________________________
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/20180130/0b6c78b8/attachment.html>

Eric Firing took s stab at it a couple of years ago: https://github.com/matplotlib/matplotlib/pull/2986

Obviously this is hard - if you stick a couple of artists on top of one another, deciding which one gets a mouse event is ambiguous.

I forget exactly how picking architecture works, but its seems *possible* to let each axes artist accept pick events. Then they can duke it out over who actually does something with it. But I?m not sure axes can actually do that at the present.

I also wonder if your `onpick` function can be made more sophisticated - I assume it knows what axis to look for picks in - maybe it could look in the twinned axis for a pick as well?

Cheers, Jody

···

On 30 Jan 2018, at 08:27, Benjamin Root <ben.v.root at gmail.com> wrote:

I seem to recall someone once messing around with the zorder of the axes object, but I forget if that actually worked. Of course the other workaround is to make the axes with the pickable objects be the twined axes.

Ben Root

On Tue, Jan 30, 2018 at 11:15 AM, Neal Becker <ndbecker2 at gmail.com <mailto:ndbecker2 at gmail.com>> wrote:
Benjamin Root wrote:

> The problem is that the second axes is getting the pick events, because it
> is on top of the first axes. This has been a problem for a long time, and
> we haven't found a good solution for it.
>
> Ben Root
>

That was my guess. Is there any workaround?

> On Tue, Jan 30, 2018 at 10:10 AM, Neal Becker > > <ndbecker2 at gmail.com <mailto:ndbecker2 at gmail.com>> wrote:
>
>> I find that pick events are fine until I add twiny. In that case,
>> nothing happens when clicking.
>>
>> THe code outline is like:
>>
>> fig, ax = plt.subplots()
>> ax2 = ax.twiny()
>> ax.semilogy(...)
>> fig.canvas.mpl_connect('pick_event', onpick)
>> ax2_xaxis = np.linspace (*ax.get_xlim(), endpoint=True,)/conversion
>> ax2.semilogy (ax2_xaxis, np.ones (len(ax2_xaxis)) * 1e-3, alpha=0)
>> ax2.set_xlabel(...)
>> ...
>>
>> removing all the lines about ax2 will restore pick function.
>>

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users at python.org <mailto:Matplotlib-users at python.org>
https://mail.python.org/mailman/listinfo/matplotlib-users

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users at python.org
https://mail.python.org/mailman/listinfo/matplotlib-users

--
Jody Klymak
http://web.uvic.ca/~jklymak/

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/matplotlib-users/attachments/20180130/c828718d/attachment.html>

I'm using something on those lines since some time that works for me
since quite some time. Here is a code fragment:

??? self.ax = self.fig.add_axes([.15, .15, .75, .75], label="left")
??? self.ax2 = self.ax.twinx()
??? self.ax2.set_label("right")
??? # critical for picking!!!
??? self.ax2.set_zorder(0)
??? self.ax2.set_autoscaley_on(True)
??? self.ax.set_zorder(1)
??? self.fig.sca(self.ax)

Best regards,

Armando

···

On 30/01/2018 17:27, Benjamin Root wrote:

I seem to recall someone once messing around with the zorder of the
axes object, but I forget if that actually worked. Of course the other
workaround is to make the axes with the pickable objects be the twined
axes.

If you know the artists you'd like to fire pick events for, you can work
around it in a few different ways. One option is to bind to mouse events
and handle firing off pick events in that callback.

Here's how mpldatacursor gets around the twinx/twiny issue:
https://github.com/joferkington/mpldatacursor/blob/master/mpldatacursor/datacursor.py#L658

Cheers,
-Joe

···

On Wed, Jan 31, 2018 at 1:31 AM, V. Armando Sol? <sole at esrf.fr> wrote:

On 30/01/2018 17:27, Benjamin Root wrote:
> I seem to recall someone once messing around with the zorder of the
> axes object, but I forget if that actually worked. Of course the other
> workaround is to make the axes with the pickable objects be the twined
> axes.
>

I'm using something on those lines since some time that works for me
since quite some time. Here is a code fragment:

            self.ax = self.fig.add_axes([.15, .15, .75, .75],
label="left")
            self.ax2 = self.ax.twinx()
            self.ax2.set_label("right")
            # critical for picking!!!!
            self.ax2.set_zorder(0)
            self.ax2.set_autoscaley_on(True)
            self.ax.set_zorder(1)
            self.fig.sca(self.ax)

Best regards,

Armando

_______________________________________________
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/20180131/3bcd5661/attachment.html>