다음 코드는 처음에는 here.에서 수집되었으며 matplotlib, 매끄럽게, cartopy를 사용하여 세계지도를 그립니다.matplotlib 아티스트의 폴리곤 격납 테스트
클릭이 이루어지면 해당 국가를 확인해야합니다. 캔버스에 pick_event
콜백을 추가 할 수 있지만 모든 아티스트 (나라에 해당하는 cartopy.mpl.feature_artist.FeatureArtist)에서 호출됩니다.
x 및 y 좌표가있는 아티스트와 마우스 이벤트가있는 경우 포함을 결정하려면 어떻게해야합니까?
나는 artist.get_clip_box().contains
을 사용해 보았지만 실제로는 폴리곤이 아니고 보통 사각형이 아닙니다.
FeatureArist
에 대한 기본 억제 테스트는 None
이므로 내 자체 테스트를 추가해야했습니다.
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()
당신은 질문이 더 도움으로 간주하고 더 많은보기를 얻을 수있다, 그래서 더 일반적인 무언가로 제목을 변경 할 수 있습니다. – Seanny123