У меня есть 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()