title: How to change colors automatically once a parameter is changed
body: <p>In the following code, the color of bars changes as the threshold is changed. Instead of using the threshold and plotting the horizontal line in the code, I want to use the y parameter in the OnMouseMove function so that the user can change the location of "threshold". Then, I want the colors to be updated as the y is changed. </p>
  
  <p>I think what I need is called "observer pattern" or perhaps a trick using the animation tools but not sure how to implement it. I appreciate any insight on how to do this. Thanks</p>
  
  <pre><code>%matplotlib notebook
  import pandas as pd
  import numpy as np
  from scipy import stats
  import matplotlib.colors as mcol
  import matplotlib.cm as cm
  import matplotlib.pyplot as plt
  
  np.random.seed(12345)
  df = pd.DataFrame([np.random.normal(335,1500,300), 
                     np.random.normal(410,900,300), 
                     np.random.normal(410,1200,300), 
                     np.random.normal(480,550,300)], 
                    index=[1,2,3,4])
  
  fig, ax = plt.subplots()
  plt.show()
  bars = plt.bar(range(df.shape[0]), df.mean(axis = 1), color = 'lightslategrey')
  
  fig = plt.gcf()
  threshold=420
  plt.axhline(y = threshold, color = 'grey', alpha = 0.5)
  
  cm1 = mcol.LinearSegmentedColormap.from_list("Test",["b", "white", "purple"])
  cpick = cm.ScalarMappable(cmap=cm1)
  cpick.set_array([])
  
  percentages = []
  for bar in bars:
      percentage = (bar.get_height()-threshold)/bar.get_height()
      if percentage&gt;1: percentage = 1
      if percentage&lt;0: percentage=0
      percentages.append(percentage)
  
  cpick.to_rgba(percentages)
  bars = plt.bar(range(df.shape[0]), df.mean(axis = 1), color = cpick.to_rgba(percentages))
  plt.colorbar(cpick, orientation='horizontal')
  
  def onMouseMove(event):
      ax.lines = [ax.lines[0]]
      plt.axhline(y=event.ydata, color="k")
  
  fig.canvas.mpl_connect('motion_notify_event', onMouseMove)
  
  plt.xticks(range(df.shape[0]), df.index, alpha = 0.8)
  </code></pre>