我尝试在类的方法中制作动态图。 这里或多或少是方法
def plot():
axes = plt.gca(bock=False)
ydata = []
xdata = []
axes.set_xlim(0, 200)
axes.set_ylim(-1,1)
line, = axes.plot(ydata, 'r-')
i=0
while True:
xdata.append(i/10)
ydata.append(np.sin(i/10))
line.set_ydata(ydata)
line.set_xdata(xdata)
plt.draw()
plt.pause(1e-17)
i+=1
plt.show()
问题是它是一个无穷循环,在这个循环函数中,我什么也做不了。 我无法使用我的 Ipython 控制台。我想在不阻止控制台的情况下运行此方法。我来这里只是使用打印和线程来做这样的事情,但 matplotlib 不支持线程。我尝试使用多处理,但仍然阻止控制台。有什么选择吗?
所以这段代码有很多问题。 首先:你传递给plt.gca()
的那个bock
参数抛出了错误。 第二:plt.show()
停止执行,因此动画不会启动。 要解决此问题,您必须在调用 plt.show(( 后触发动画。 一种方法是利用事件。您可以在此处阅读有关它们的更多信息: https://matplotlib.org/3.2.1/users/event_handling.html 最后,您可以使用条件和break
来确保循环不是无限的。 下面是一个示例:
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
def plot(lim=100):
"""
Parameters
----------
lim -> int: Iteration where you want to stop
"""
axes = plt.gca()#bock=False Was removed because it threw errors
fig = plt.gcf()
canvas = fig.canvas
ydata = []
xdata = []
axes.set_xlim(0, 200)
axes.set_ylim(-1,1)
line, = axes.plot(xdata, ydata,'r-')
#Now, we can't just start the loop because plt.show() will
#Stop execcution. Instead we can make a trigger that starts
#the loop. I will use a mouse event.
def start_loop():
i=0
while True:
xdata.append(i/10)
ydata.append(np.sin(i/10))
line.set_ydata(ydata)
line.set_xdata(xdata)
canvas.draw()
canvas.flush_events()#This makes the updating less laggy
plt.pause(1e-17)#Removable
i+=1
if i==lim:
break
canvas.mpl_connect("button_press_event",
lambda click: start_loop())
#Click the plot to start the animation
plt.show()
plot()
此外,如果您想要更快的执行速度,请使用blit
或动画功能 来自马特普洛特利布像FuncAnimation
.