Я пытаюсь использовать подход DataCursor (https://stackoverflow.com/a/4674445/1301710), чтобы пометить точки с помощью matplotlib. У меня есть несколько тысяч точек, и я хотел бы видеть их метки при наведении курсора. Однако есть два различия: одно, я ' Я делаю график рассеяния и два, я хочу пометить имена для каждой точки, а не только координаты x, y.
вот мой код
import os
import matplotlib.pyplot as plt
class DataCursor(object):
text_template = 'x: %0.2f\ny: %0.2f'
x, y = 0.0, 0.0
xoffset, yoffset = -20, 20
text_template = 'x: %0.2f\ny: %0.2f'
def __init__(self, ax, labels,x,y):
self.ax = ax
self.xlist = x
self.ylist = y
self.labels = labels
self.annotation = ax.annotate(self.text_template,
xy=(self.x, self.y), xytext=(self.xoffset, self.yoffset),
textcoords='offset points', ha='right', va='bottom',
bbox=dict(boxstyle='round,pad=0.5', fc='yellow', alpha=0.5),
arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0')
)
self.annotation.set_visible(False)
def __call__(self, event):
self.event = event
xdata, ydata = event.artist.get_data()
#self.x, self.y = xdata[event.ind], ydata[event.ind]
self.x, self.y = event.mouseevent.xdata, event.mouseevent.ydata
self.label = self.labels[self.xlist.index(self.x)]
if self.x is not None:
self.annotation.xy = self.x, self.y
self.annotation.set_text(self.label)
self.annotation.set_visible(True)
event.canvas.draw()
def process():
#code to make ht_dict here
# ht_dict has the following format: 'ht1' = [nov14count, nov21count] where each key is a string and each value is a list of two integers
print("Start making scatter plot..")
hts = []
nov14 = []
nov21 = []
for key in ht_dict.keys():
nov14.append(ht_dict[key][0])
nov21.append(ht_dict[key][1])
hts.append(key)
fig = plt.figure()
scatter = plt.scatter(nov14, nov21)
fig.canvas.mpl_connect('pick_event', DataCursor(plt.gca(), hts, nov14, nov21))
scatter.set_picker(5)
plt.show()
process()
Я получаю следующую ошибку:
AttributeError: 'CircleCollection' object has no attribute 'get_data'
Я хочу иметь возможность видеть строку, сохраненную в списке hts, при наведении курсора на координаты x и y, хранящиеся в списках nov14 и nov21, соответственно, с одинаковыми индексами. Я не уверен, что делать с этой ошибкой, и был бы признателен за любую помощь.
Другой вопрос, который у меня есть (от попытки изменения существующего графика в потоке DataCursor), что использование индекса для возврата метки, как я сейчас делаю, даст мне значение, которого не существует в ошибке списка, поскольку нажатие на значение может не может быть точно таким же, как значение в списке. Есть ли у вас какие-либо предложения относительно лучшего способа отображения метки / названия точки?
Буду признателен за любые указания или ссылки на документацию, где я мог бы прочитать.
Спасибо!