Onpick3 Наведите указатель мыши на ближайшую точку данных, а не на список

После нескольких дней попыток выяснить это, я подумал, что попрошу о помощи...

У меня есть 3 списка, lon, lat и pop одинаковой длины. С lon[1],lat[1] соответствует pop[1]. То, что я хочу сделать, это после того, как они нанесут их на график, "навести курсор на карту", ​​а затем (в конечном счете, построить временной ряд населения для каждой точки), но сейчас я просто хочу знать, какова соответствующая величина населения...

Я использовал это ниже, но я не знаю, как

а) доберитесь до ближайшего широты, так как в данный момент он выводит список возможных опций

б) при увеличении рисунка затем нажмите, потому что кнопка увеличения при нажатии, кажется, останавливает дальнейшие записи точек...

#Import modules

import netCDF4 as nc4
from netCDF4 import Dataset
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.basemap import Basemap
from matplotlib import cm as cm
from matplotlib import mlab as ml
import matplotlib as mpl
from matplotlib.pyplot import figure, show

def extractdata(nc_filename,column_data):
    dataset=Dataset(nc_filename)    #Reads the data into a column format 
    output= dataset.variables[column_data][:]
    dataset.close()

    return(output)

#Start of program

inputfile='reference_pop.nc'
dataset = Dataset(inputfile)
print(dataset.variables.keys())

time=extractdata(inputfile,'time')
lon=extractdata(inputfile,'lon')
lat=extractdata(inputfile,'lat')
pop=extractdata(inputfile,'pop')



index=np.arange(len(lat))

#Reverse the time order (So that 0 is 120,000 years ago aka from past to present
time=time[::-1]
#Reverse population order 
pop=pop[::-1]   #Population is a 2d matrix, of dimensions pop and len(lon/lat)



def onpick3(event):
    ind = event.ind
    #print 'onpick3 scatter:', ind, npy.take(lon, ind), npy.take(lat, ind)
    print 'ind', ind    #Example output: [2513 2673 2843 3022 3023 3024 3025 3203]
    print 'npy.take(lon, ind)',npy.take(lon, ind)  #Example output [ 21398764.  21459962.  21520490.  21391092.  21454742.  21517902.  21580542.  21577006.]
    print 'npy.take(lat, ind)',npy.take(lat, ind)   #Example output [ 21398764.  21459962.  21520490.  21391092.  21454742.  21517902.  21580542.  21577006.]

    #Will need to reverse back from basemap lat,lon to normal but that is easy


fig = figure()
ax1 = fig.add_subplot(111)


map1 = Basemap(projection='mill',lon_0=0, ax=ax1)

map1.drawmapboundary(fill_color='#9999FF')
##mapping coordinates according to basemap
lon,lat=map1(lon,lat)

ax1.scatter(lon,lat,c=index,cmap=mpl.cm.get_cmap('jet'),picker=1)

fig.canvas.mpl_connect('pick_event', onpick3)

plt.show()

Большое спасибо за вашу помощь!

1 ответ

Решение

Я, вероятно, сделал это очень замысловатым способом, но оказалось, что когда я зависал (увеличенное изображение на карте), он записал только одну точку), но когда я был так далеко, точка содержала несколько, на данный момент, учитывая плотность карты и то, что она не будет иметь значения, я просто выбрал первый индекс в списке.

def hover(event):

    #Returns a dictionary
    cont, ind = sc.contains(event)

    #Turn dictionary into a list
    myList = []  
    for k,v in ind.items():
        myList.append(v[0])

    #Take first element as it really doesn't matter, as the indexes are so close together 
    ind=myList[0]
fig1.canvas.mpl_connect("motion_notify_event", hover)
Другие вопросы по тегам