Matplotlib动画:如何使某些线条不可见

2024-06-28 19:26:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在通过串行端口读取一些传感器值。
我希望能够根据按键显示/隐藏相应的行。在

下面是代码:它被过度简化了(抱歉,它太长了)。 我想通过按1显示/隐藏3个子图中的所有蓝线;按2显示/隐藏所有红线。在

我只能“冻结”这些行,但不能隐藏它们。
我错过了什么?在

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

Tags: ofplotnpzerospltaxglobalset
1条回答
网友
1楼 · 发布于 2024-06-28 19:26:04

您应该隐藏/显示以下行:

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

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

相关问题 更多 >