Note that there are some explanatory texts on larger screens.

plurals
  1. POUsing matplotlib to label points on a scatter plot on mouse over with some label other than x,y coordinates
    text
    copied!<p>I am trying to use the DataCursor approach (<a href="https://stackoverflow.com/a/4674445/1301710">https://stackoverflow.com/a/4674445/1301710</a>) to label points using matplotlib. I have several thousand points and would like to see their label on mouseover. However, there are two differences: one, I'm making a scatter plot and two, I want to label names for each point and not just the x,y coordinates.</p> <p>here is my code</p> <pre><code>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='-&gt;', 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() </code></pre> <p>I am getting the following error though:</p> <pre><code>AttributeError: 'CircleCollection' object has no attribute 'get_data' </code></pre> <p>I want to be able to see the string stored in the list hts on mouseover at the x and y coordinates stored in nov14 and nov21 lists respectively at the same indices. I'm not sure what to make of this error and would appreciate any help. Another question I have is (from trying out changes on the existing plot in the DataCursor thread) that using index of to get back label as I am currently doing will give me a value doesn't exist in list error since the clicked on value may not be exactly same as the value in the list. Do you have any suggestions of a better way to display some label/name about a point?</p> <p>Any guidance or pointers to documentation where I could read up would be appreciated.</p> <p>Thanks!</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload