2016-08-22 63 views
1

我正在通過串口讀取一些傳感器值。
我希望能夠根據按鍵顯示/隱藏相應的行。Matplotlib動畫:如何使一些行不可見

這是代碼:它已經過於簡化了(對不起,它很長)。 我想通過按顯示/隱藏3個子圖中的所有藍線;所有紅線顯示/隱藏按。

我只能「凍結」行但不能隱藏它們。
我錯過了什麼?

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() 
+0

謝謝烏爾夫編輯我的職務。 –

回答

1

你應該隱藏/顯示行:

lineVal1.set_visible(showLines1) 
lineSpeed1.set_visible(showLines1) 
lineAccel1.set_visible(showLines1) 

lineVal2.set_visible(showLines2) 
lineSpeed2.set_visible(showLines2) 
lineAccel2.set_visible(showLines2) 
+0

謝謝蒂姆!我完全錯過了:-) –

相關問題