Python неправильно выбрал matplotlib на художниках после увеличения - PullRequest
0 голосов

У меня есть matplotlib и базовая карта, встроенные в диалог PyQt5. У меня есть группа исполнителей, которым я хочу сделать функциональность. В большинстве случаев все работает нормально, но иногда, когда я выбираю регион художников или какой-то другой художник запускается неправильный художник, и самое странное в том, что это происходит сразу для нескольких (неправильных) художников.

Похоже, что после увеличения художники сохраняют свою прежнюю позицию

Минимальный пример:

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
from PIL import Image
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
from matplotlib.patches import Circle,Rectangle,PathPatch,Polygon
from matplotlib.collections import PatchCollection
import numpy as np
import random



def on_pick(event):
    if event.mouseevent.button == 1 and isinstance(event.artist, AnnotationBbox) == True and event.artist.get_gid() != None:
        artist = event.artist
        pid = artist.get_gid()
        print(pid)
        return True



figure,ax = plt.subplots(1)#,num="Map viewer")
def format_coord(x, y):
    try:
        x,y = m(x, y,inverse = True)
        if y<-90 or y>90 or x<-180 or x>180:
            pass
        else:
            if y < 0:
                S_OR_N = "S"
                y = abs(y)
                int_part = int(y)
                min_part = int((y - int_part)*60)

                seconds_part = int(( y - int_part - (min_part/60))*3600)
            elif y > 0:
                S_OR_N = "N"
                y = abs(y)
                int_part = int(y)
                min_part = int((y - int_part)*60)
                seconds_part = int(( y - int_part - (min_part/60))*3600)
            else:
                S_OR_N = ""

            if x < 0:
                E_OR_W = "W"
                x = abs(x)
                int_part2 = int(x)
                min_part2 = int((x - int_part2)*60)

                seconds_part2 = int(( x - int_part2 - (min_part2/60))*3600)
            elif x > 0:
                E_OR_W = "E"
                x = abs(x)
                int_part2 = int(x)
                min_part2 = int((x - int_part2)*60)        
                seconds_part2 = int(( x - int_part2 - (min_part2/60))*3600)
            else:
                E_OR_W = ""
            return '{} {}° {}\' {}\"   {} {}° {}\' {}"'.format(E_OR_W,str(int_part2).zfill(3),str(min_part2).zfill(2),str(seconds_part2).zfill(2),
                                                                  S_OR_N,str(int_part).zfill(2),str(min_part).zfill(2),str(seconds_part).zfill(2))
    except:
        pass


ax.format_coord = format_coord 
m = Basemap(projection='cyl',llcrnrlat=-90,urcrnrlat=90,\
        llcrnrlon=-180,urcrnrlon=180,lat_ts=20,resolution='c')
m.drawmeridians(np.arange(0,360,30))
m.drawparallels(np.arange(-90,90,10)) 
m.drawmapboundary(fill_color='aqua')
# fill continents, set lake color same as ocean color.
m.fillcontinents(color='coral',lake_color='aqua')

#### rundom coordinates ####
list_random = []
for i in range (0,400):
    x = random.randrange(-180, 180)
    y = random.randrange(-90, 90)
    list_random.append([x,y])

id = 0 
airport = np.array(Image.open('test_alt.png'))###3 change here for any small(50x50) image
for i in list_random:
    im = OffsetImage(airport,zoom = 0.22)
    ab = AnnotationBbox(im, (float(i[0]),float(i[1])), xycoords='data',frameon=False)
    ab.set_gid(id)
    ab.set_picker(0.1)
    ax.add_artist(ab)
    id+=1

pick = figure.canvas.mpl_connect('pick_event',on_pick)

plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...