use*_*666 2 python plot numpy matplotlib scipy
我正在编写一个应用程序来显示动态变化的数据(从套接字读取的数据).
作为一个虚拟案例,我尝试绘制一个幅度乘以每秒1.1的正弦:
import numpy as np
import matplotlib.pyplot as plt
import time
x = np.arange(0, 10, 0.1);
y = np.sin(x)
for i in xrange(100):
plt.plot(x, y)
time.sleep(1)
y=y*1.1
Run Code Online (Sandbox Code Playgroud)
这显然不是这样做的,但它表明了我的意图.
怎么能正确完成?
编辑: 以下是@mskimm答案中建议的代码的回溯输出:
plt.show() #Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 505, in run
self.__target(*self.__args, **self.__kwargs)
File "<ipython-input-5-ed773f8e3e84>", line 7, in update
plt.draw()
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 466, in draw
get_current_fig_manager().canvas.draw()
File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 240, in draw
tkagg.blit(self._tkphoto, self.renderer._renderer, colormode=2)
File "/usr/lib/pymodules/python2.7/matplotlib/backends/tkagg.py", line 12, in blit
tk.call("PyAggImagePhoto", photoimage, id(aggimage), colormode, id(bbox_array))
RuntimeError: main thread is not in main loop
Run Code Online (Sandbox Code Playgroud)
编辑2:
事实证明,在qtconsole中运行相同的代码...(任何想法为什么?)然而,每个打印重新缩放到绘图,因此缺少"动画效果".我尝试使用,plt.autoscale_view(False,False,False)但这根本没有引起任何情节.
per*_*iae 10
使用matplotlib动画API有更好的方法来做到这一点,但这是一个快速而肮脏的方法:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 10, 0.1)
y = np.sin(x)
plt.ion()
ax = plt.gca()
ax.set_autoscale_on(True)
line, = ax.plot(x, y)
for i in xrange(100):
line.set_ydata(y)
ax.relim()
ax.autoscale_view(True,True,True)
plt.draw()
y=y*1.1
plt.pause(0.1)
Run Code Online (Sandbox Code Playgroud)
关键步骤是:
plt.ion().plot再次调用.plt.pause.我包含了自动缩放视口的代码,但这并不是绝对必要的.