[Раствор был добавлен к разделам 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
Спасибо Офира. Я бы никогда не нашел его без твоей помощи. Теперь это совершенно логично. –
Добро пожаловать. –