2016-08-22 8 views
2

[Раствор был добавлен к разделам EDIT в этом посте]Matplotlib анимация: вертикальный курсор линия через подзаговоры

2 анимированные подзаговоры уложены вертикально.

Я хочу показать черную вертикальную линию через них в соответствии с положением мыши.

До сих пор я могу только полностью испортить рисунок при перемещении мыши ...

Как очистить старые вертикальные линии между обновлениями?

(Просто из любопытства.?!?, Так как управление движением мыши, мой компьютер вентилятор сходит с ума при выполнении кода, даже не перемещая мышь мышь так «Расчет дорогой»)

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
from time import sleep 

val1 = np.zeros(100)   
val2 = np.zeros(100)  

level1 = 0.2 
level2 = 0.5 

fig, ax = plt.subplots() 

ax1 = plt.subplot2grid((2,1),(0,0)) 
lineVal1, = ax1.plot(np.zeros(100)) 
ax1.set_ylim(-0.5, 1.5)  

ax2 = plt.subplot2grid((2,1),(1,0)) 
lineVal2, = ax2.plot(np.zeros(100), color = "r") 
ax2.set_ylim(-0.5, 1.5)  


def onMouseMove(event): 
    ax1.axvline(x=event.xdata, color="k") 
    ax2.axvline(x=event.xdata, color="k") 



def updateData(): 
    global level1, val1 
    global level2, val2 

    clamp = lambda n, minn, maxn: max(min(maxn, n), minn) 

    level1 = clamp(level1 + (np.random.random()-.5)/20.0, 0.0, 1.0) 
    level2 = clamp(level2 + (np.random.random()-.5)/10.0, 0.0, 1.0) 

    # values are appended to the respective arrays which keep the last 100 readings 
    val1 = np.append(val1, level1)[-100:] 
    val2 = np.append(val2, level2)[-100:] 

    yield 1  # FuncAnimation expects an iterator 

def visualize(i): 

    lineVal1.set_ydata(val1) 
    lineVal2.set_ydata(val2) 

    return lineVal1,lineVal2 

fig.canvas.mpl_connect('motion_notify_event', onMouseMove) 
ani = animation.FuncAnimation(fig, visualize, updateData, interval=50) 
plt.show() 

Edit1

Как решается Офир:

def onMouseMove(event): 
    ax1.lines = [ax1.lines[0]] 
    ax2.lines = [ax2.lines[0]] 
    ax1.axvline(x=event.xdata, color="k") 
    ax2.axvline(x=event.xdata, color="k") 

Edit2

В случае, если есть несколько наборов данных в том же участке, например, в:

ax1 = plt.subplot2grid((2,1),(0,0)) 
lineVal1, = ax1.plot(np.zeros(100)) 
lineVal2, = ax2.plot(np.zeros(100), color = "r") 
ax1.set_ylim(-0.5, 1.5)  

линия каждого набора данных хранится в ax1.lines[]:

  • ax1.lines[0] является lineVal1
  • ax1.lines[1] является lineVal2
  • ax1.lines[2] - вертикальная линия, если вы уже привлек его.

Это означает, что onMouseMove должен быть изменен на:

def onMouseMove(event): 
    ax1.lines = ax1.lines[:2] # keep the first two lines 
    ax1.axvline(x=event.xdata, color="k") # then draw the vertical line 

ответ

1

заменить вашу onMouseMove с следующим:

How to remove lines in a Matplotlib plot)

def onMouseMove(event): 
    ax1.lines = [ax1.lines[0]] 
    ax2.lines = [ax2.lines[0]] 
    ax1.axvline(x=event.xdata, color="k") 
    ax2.axvline(x=event.xdata, color="k") 
+0

Спасибо Офира. Я бы никогда не нашел его без твоей помощи. Теперь это совершенно логично. –

+0

Добро пожаловать. –