Teste de contenção de polígonos no matplotlib artist

Eu tenho o código a seguir, reunido inicialmente deaqui., que usa cartilagem matplotlib, bem torneada, para desenhar um mapa do mundo.

Quando um clique é feito, preciso determinar em que país ele foi feito. Eu posso adicionar umpick_event retorno de chamada para a tela, no entanto, é chamado para todos os artistas. (cartopy.mpl.feature_artist.FeatureArtist, que corresponde a um país).

Dado um artista e um evento de mouse com coordenadas x, y, como posso determinar a contenção?

eu tenteiartist.get_clip_box().contains, mas não é realmente um polígono, é um retângulo simples.

O teste de contenção padrão para oFeatureArists éNone, então tive que adicionar meu próprio teste de contenção.

Como posso verificar corretamente a contenção do ponto de evento do mouse, dentro do FeatureArtist?

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import cartopy.io.shapereader as shpreader
import itertools, pdb, subprocess, time, traceback
from itertools import *
import numpy as np
from pydoc import help as h

shapename = 'admin_0_countries'
countries_shp = shpreader.natural_earth(resolution='110m',
                                        category='cultural', name=shapename)

earth_colors = np.array([(199, 233, 192),
                                (161, 217, 155),
                                (116, 196, 118),
                                (65, 171, 93),
                                (35, 139, 69),
                                ]) / 255.
earth_colors = itertools.cycle(earth_colors)

ax = plt.axes(projection=ccrs.PlateCarree())


def contains_test ( artist, ev ):
    print "contain test called"
    #this containmeint test is always true, because it is a large rectangle, not a polygon
    #how to define correct containment test
    print "click contained in %s?: %s" % (artist.countryname, artist.get_clip_box().contains(ev.x, ev.y))
    return True, {}

for country in shpreader.Reader(countries_shp).records():
    # print country.attributes['name_long'], earth_colors.next()
    art = ax.add_geometries(country.geometry, ccrs.PlateCarree(),
                      facecolor=earth_colors.next(),
                      label=country.attributes['name_long'])

    art.countryname = country.attributes["name_long"] 
    art.set_picker(True)
    art.set_contains(contains_test)
    def pickit ( ev ):
        print "pickit called"
        print ev.artist.countryname



def onpick ( event ):
    print "pick event fired"

ax.figure.canvas.mpl_connect("pick_event", onpick)


def onclick(event):
    print 'button=%s, x=%s, y=%s, xdata=%s, ydata=%s'%(event.button, event.x, event.y, event.xdata, event.ydata)

ax.figure.canvas.mpl_connect('button_press_event', onclick)
plt.show()

questionAnswers(1)

yourAnswerToTheQuestion