Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>You have to redraw the figure - simply by adding a <code>plt.draw</code> to the onclick method.<br> Moreover you have to connect the event before you show the figure. Of course, here your annotation text is 'picco' not '5'.</p> <p>Try:</p> <pre><code>import matplotlib.pyplot as plt X=[1,2,3,4,5,6,7,8,9,10] Y=[1,1,1,2,10,2,1,1,1,1] fig = plt.figure() ax = fig.add_subplot(111) ax.plot(X,Y,label="prova") #plot the function #plt.legend(loc=1, ncol=1, shadow=True) plt.xlim(min(X) * 0.9, max(X) * 1.1) plt.ylim(min(Y) * 0.9, max(Y) * 1.1) plt.ylabel(r'Y axis') plt.xlabel(r'X axis') Diz=dict(zip(X,Y)) #create a dictionary that associate X with Y Interval=[] #interval where the user search for peaks PeaksList=[] #list of peaks found def onclick(event): print 'First limit at =%f'%(event.xdata) Interval.append(event.xdata) if len(Interval)%2==0: a=Interval[-2] b=Interval[-1] if b&lt;a: #if the user select first the highest value these statements filp it! A=b B=a else: A=a B=b #find the max Y value: the peak! peakY=0 #max Y value piccoX=0 #value of the X associate to the peak for i in [ j for j in X if A&lt;j&lt;B] : if Diz[i]&gt;peakY: peakY=Diz[i] piccoX=i print "Interval: %f - %f Peak at: %f " %(a,b,piccoX) PeaksList.append([piccoX,peakY]) ax.annotate("picco", xy=(piccoX,peakY), xycoords='data', xytext=(-50, 30), textcoords='offset points', arrowprops=dict(arrowstyle="-&gt;") ) plt.draw() cid = fig.canvas.mpl_connect('button_press_event', onclick) plt.show() </code></pre> <p>Maybe visually more appealing (using the spanselector):</p> <pre><code>import matplotlib.pyplot as plt from matplotlib.widgets import SpanSelector X=[1,2,3,4,5,6,7,8,9,10] Y=[1,1,1,2,10,2,1,1,1,1] fig = plt.figure() ax = fig.add_subplot(111) ax.plot(X,Y,label="prova") #plot the function #plt.legend(loc=1, ncol=1, shadow=True) plt.xlim(min(X) * 0.9, max(X) * 1.1) plt.ylim(min(Y) * 0.9, max(Y) * 1.1) plt.ylabel(r'Y axis') plt.xlabel(r'X axis') Diz=dict(zip(X,Y)) #create a dictionary that associate X with Y Interval=[] #interval where the user search for peaks PeaksList=[] #list of peaks found def onclick(xmin, xmax): print 'Interval: {0} - {1}'.format(xmin,xmax) peakY=0 #max Y value piccoX=0 #value of the X associate to the peak for i in [ j for j in X if xmin&lt;j&lt;xmax] : if Diz[i]&gt;peakY: peakY=Diz[i] piccoX=i print "Peak at: %f " % piccoX PeaksList.append([piccoX,peakY]) ax.annotate("picco", xy=(piccoX,peakY), xycoords='data', xytext=(-50, 30), textcoords='offset points', arrowprops=dict(arrowstyle="-&gt;")) plt.draw() span = SpanSelector(ax, onclick, 'horizontal', useblit=True, rectprops=dict(alpha=0.5, facecolor='blue') ) plt.show() </code></pre>
 

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