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不支持线程。我尝试使用多处理程序,但仍会阻塞控制台。有什么选择吗?
答案 0 :(得分:0)
所以这段代码有很多问题。
首先:您传递给bock
的{{1}}自变量引发错误。
第二:plt.gca()
停止执行,因此动画将不会开始。
要解决此问题,必须在调用plt.show()之后触发动画。
一种方法是利用事件。您可以在这里阅读有关它们的更多信息:
https://matplotlib.org/3.2.1/users/event_handling.html
最后,您可以使用条件和plt.show()
来确保循环不是无限的。
这是一个示例:
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()
或动画功能
来自matplotlib,例如blit
。