title: Matplotlib animation: how to make some lines not visible
body: <p>I am reading some sensors values by serial port.<br>
  I would like to be able to show/hide the respective lines according to key presses.</p>
  
  <p>Here is the code: it has been overly simplified (sorry it is long anyway).
  I would like to make ALL blue lines in the 3 subplots show/hide by pressing <kbd>1</kbd>; all red lines show/hide by pressing <kbd>2</kbd>.  </p>
  
  <p>I can only "freeze" the lines but not hide them.<br>
  What am I missing? </p>
  
  <pre><code>import numpy as np
  import matplotlib.pyplot as plt
  import matplotlib.animation as animation
  from time import sleep
  
  # arrays of last 100 data (range 0.-1.)
  # read from serial port in a dedicated thread
  val1 = np.zeros(100)     
  val2 = np.zeros(100)    
  
  speed1=[]   # speed of change of val1 and val2
  speed2=[]
  
  accel1=[]   # speed of change of speed1 and speed2
  accel2=[]
  
  # initial level for each channel
  level1 = 0.2
  level2 = 0.8
  
  fig, ax = plt.subplots()
  
  ax = plt.subplot2grid((3,1),(0,0))
  lineVal1, = ax.plot(np.zeros(100))
  lineVal2, = ax.plot(np.zeros(100), color = "r")
  ax.set_ylim(-0.5, 1.5)    
  
  axSpeed = plt.subplot2grid((3,1),(1,0))
  lineSpeed1, = axSpeed.plot(np.zeros(99))
  lineSpeed2, = axSpeed.plot(np.zeros(99), color = "r")
  axSpeed.set_ylim(-.1, +.1)
  
  axAccel = plt.subplot2grid((3,1),(2,0))
  lineAccel1, = axAccel.plot(np.zeros(98))
  lineAccel2, = axAccel.plot(np.zeros(98), color = "r")
  axAccel.set_ylim(-.1, +.1)
  
  
  showLines1 = True
  showLines2 = True
  
  def onKeyPress(event):
    global showLines1, showLines2
    if event.key == "1": showLines1 ^= True
    if event.key == "2": showLines2 ^= True
  
  
  
  def updateData():
    global level1, level2
    global val1, val2
    global speed1, speed2
    global accel1, accel2
  
    clamp = lambda n, minn, maxn: max(min(maxn, n), minn)
  
    # level1 and level2 are really read from serial port in a separate thread
    # here we simulate them
    level1 = clamp(level1 + (np.random.random()-.5)/20.0, 0.0, 1.0)
    level2 = clamp(level2 + (np.random.random()-.5)/20.0, 0.0, 1.0)
  
  
    # last reads are appended to data arrays
    val1 = np.append(val1, level1)[-100:] 
    val2 = np.append(val2, level2)[-100:]
  
    # as an example we calculate speed and acceleration on received data
    speed1=val1[1:]-val1[:-1]   
    speed2=val2[1:]-val2[:-1]
  
    accel1=speed1[1:]-speed1[:-1]   
    accel2=speed2[1:]-speed2[:-1]
  
    yield 1 # FuncAnimation expects an iterator
  
  
  
  def visualize(i):
  
    if showLines1:
      lineVal1.set_ydata(val1)
      lineSpeed1.set_ydata(speed1)
      lineAccel1.set_ydata(accel1)
  
    if showLines2:
      lineVal2.set_ydata(val2)
      lineSpeed2.set_ydata(speed2)
      lineAccel2.set_ydata(accel2)
  
    return lineVal1,lineVal2, lineSpeed1, lineSpeed2, lineAccel1, lineAccel2
  
  fig.canvas.mpl_connect('key_press_event', onKeyPress)
  
  ani = animation.FuncAnimation(fig, visualize, updateData, interval=50)
  plt.show()
  </code></pre>