<p>不需要在绘图中添加新的<code>axvline</code>,只需更改现有绘图的数据即可。您只需要存储<code>axvline</code>调用的返回值,就可以保留它的句柄。数据格式是<code>([x, x], [0, 1])</code>,可以使用<code>set_data</code>更改它。
(顺便说一下,对于axhlines,格式是<code>([0, 1], [y, y])</code>。)</p>
<p>添加以下全局变量:</p>
<pre><code>axvline1 = ax1.axvline(x=0., color="k")
axvline2 = ax2.axvline(x=0., color="k")
</code></pre>
<p>并将conMouseMove处理程序更改为:</p>
^{pr2}$
<p>一个小缺点是从一开始就从x=0的vline开始。在</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)
axvline1 = ax1.axvline(x=0., color="k")
axvline2 = ax2.axvline(x=0., color="k")
def onMouseMove(event):
axvline1.set_data([event.xdata, event.xdata], [0, 1])
axvline2.set_data([event.xdata, event.xdata], [0, 1])
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()
</code></pre>