回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p><strong>[解决方案已添加到本文的编辑部分]</strong></p>
<p>两个动画子图垂直堆叠。在</p>
<p>我想显示一个黑色垂直线通过他们根据鼠标的位置。在</p>
<p>到目前为止,我只能在移动鼠标的时候完全弄乱人物。。。在</p>
<p>如何清除更新之间的旧垂直线?在</p>
<p>(只是出于好奇:由于鼠标的移动控制,我的电脑迷在不移动鼠标的情况下执行代码时会发疯。鼠标这么“计算贵”?!?)在</p>
<pre><code>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 <a href="https://www.cnpython.com/list/append" class="inner-link">append</a>ed 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()
</code></pre>
<p><strong>编辑1</strong></p>
<p>由Ophir解决:</p>
^{pr2}$
<p><strong>编辑2</strong></p>
<p>如果同一绘图中有更多数据集,如:</p>
<pre><code>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)
</code></pre>
<p>每个数据集的行存储在<code>ax1.lines[]</code>:</p>
<ul>
<li><code>ax1.lines[0]</code>是<code>lineVal1</code></li>
<li><code>ax1.lines[1]</code>是{<cd5>}</li>
<li><code>ax1.lines[2]</code>是垂直线,如果您已经绘制了它。在</li>
</ul>
<p>这意味着<code>onMouseMove</code>必须更改为:</p>
<pre><code>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
</code></pre>