0

I read the document of matplotlib and write the following code, it supposed to capture my mouse event and move the grey line position when i clicked. I read this code in jupiter notebook online, it stop to show the coordinate of my cursor as it usually do, What's happend? Can anyone help me?

import pandas as pd
import numpy as np
import matplotlib.colors as mcol
import matplotlib.cm as cm
from scipy import stats
from matplotlib.lines import Line2D
import matplotlib.pyplot as plt 
import scipy.spatial as spatial
np.random.seed(12345)

df = pd.DataFrame([np.random.normal(33500,150000,3650), 
                   np.random.normal(41000,90000,3650), 
                   np.random.normal(41000,120000,3650), 
                   np.random.normal(48000,55000,3650)], 
                  index=[1992,1993,1994,1995])

fig, ax = plt.subplots()

year_avg = df.mean(axis = 1)
year_std = df.std(axis = 1)
yerr = year_std / np.sqrt(df.shape[1]) * stats.t.ppf(1-0.05/2, df.shape[1]-1)

bars=ax.bar(range(df.shape[0]), year_avg, yerr = yerr, color = 'lightslategrey')
threshold=42000
line=plt.axhline(y = threshold, color = 'grey', alpha = 0.5)

cm1 = mcol.LinearSegmentedColormap.from_list("CmapName",["yellow", "orange", "red"])
cpick = cm.ScalarMappable(cmap=cm1)
percentages = []
cpick.set_array([])
def setColor(bars, yerr,threshold):
    for bar, yerr_ in zip(bars, yerr):
        low = bar.get_height() - yerr_
        high = bar.get_height() + yerr_
        percentage = (high-threshold)/(high-low)
        if percentage>1: percentage = 1
        if percentage<0: percentage=0
        percentages.append(percentage)
    cpick.to_rgba(percentages)
    bars = ax.bar(range(df.shape[0]), year_avg, yerr = yerr, color = cpick.to_rgba(percentages))
    return bars
line=plt.axhline(threshold, color = 'grey', alpha = 0.5)

setColor(bars, yerr,threshold)
plt.colorbar(cpick, orientation='horizontal')
plt.xticks(range(df.shape[0]), df.index)
fig = plt.figure()
plt.show()

def onclick(event):
    print('%s click: button=%d, x=%d, y=%d, xdata=%f, ydata=%f' %
          ('double' if event.dblclick else 'single', event.button,
           event.x, event.y, event.xdata, event.ydata))
    line.set_ydata(event.ydata)
    #plt.draw()
cid = fig.canvas.mpl_connect('button_press_event', onclick)
qiqi li
  • 41
  • 2
  • By "online" do you mean "inline"? Inline graphics are png and therefore not interactive. You may use `%matplotlib notebook` instead. – ImportanceOfBeingErnest Apr 12 '18 at 07:57
  • Thanks a lot for answering my first question in stackoverflow . It really worked. But when the onclick function run ,it didn't print anything, although it did run the second line in my function, which is to reset y value of a line. Did you know the reason ? – qiqi li Apr 13 '18 at 03:48
  • Yes the print function cannot work from within an event loop in jupyter. You may use `IPython.display` instead. – ImportanceOfBeingErnest Apr 13 '18 at 10:08

0 Answers0