2016-02-05 38 views
2

我试图用for循环实时绘制数字。我有以下简单的代码:MatPlotLib的离子()和绘制()不工作

import matplotlib.pyplot as plt 

plt.ion() 
plt.figure() 
for i in range(100): 
    plt.plot([i], [i], 'o') 
    plt.draw() 
    plt.pause(0.0001) 

此代码不显示图形,直到它完成计算,我不想。我希望它在每个循环之后画出图。如果我用plt.show替换plt.draw(),则会实时输出多个数字,但我希望它们全都出现在同一图中。有任何想法吗?

编辑:
我下载了PyCharm与Anaconda,一切正常。我想这是Spyder的问题,因为我尝试了几个不同的版本,但没有成功。如果有人有任何线索是Spyder导致这个问题的原因,请告诉我!

+0

尝试把'plt.show()'plt.figure后'()'。 – Ben

+0

这样做,我得到输出'',并且代码与以前一样评估。 – Alex

+0

你如何执行脚本?从bash终端调用'python stript.py'?或者从Ipython终端中调用'%run'? – Ben

回答

3

适合你的情况从:Python realtime plotting

import matplotlib.pyplot as plt 
import numpy as np 
import time 

fig = plt.figure() 
ax = fig.add_subplot(111) 

# some X and Y data 
x = [0] 
y = [0] 

li, = ax.plot(x, y,'o') 

# draw and show it 
fig.canvas.draw() 
plt.show(block=False) 

# loop to update the data 
for i in range(100): 
    try: 
     x.append(i) 
     y.append(i) 

     # set the new data 
     li.set_xdata(x) 
     li.set_ydata(y) 

     ax.relim() 
     ax.autoscale_view(True,True,True) 

     fig.canvas.draw() 

     time.sleep(0.01) 
    except KeyboardInterrupt: 
     plt.close('all') 
     break 
+0

感谢您的回复。我试着运行你的代码,但是我得到一个错误,说'show()有一个意外的参数。我读到块参数是实验性的,但我不确定为什么它不适用于我的Spyder平台。 – Alex

+0

它没有'block'关键字吗?如果你已经处于交互模式,显然它不工作。 – CoMartel

+0

它没有阻塞语句,但这样做输出许多不同的数字。有没有办法把它们放在一起? – Alex

0

嘿,我有同样的问题,我检查了其他问题,当我插入一个暂停到我的解决方案解决了我的问题。以下是一些适用于我的示例代码。

import matplotlib.pyplot as plt 
import numpy as np 
plt.ion() 
x = np.arange(0, 4*np.pi, 0.1) 
y = [np.sin(i) for i in x] 
plt.plot(x, y, 'g-', linewidth=1.5, markersize=4) 
plt.pause(0.0001)   
plt.plot(x, [i**2 for i in y], 'g-', linewidth=1.5, markersize=4) 
plt.pause(0.0001) 
plt.plot(x, [i**2*i+0.25 for i in y], 'r-', linewidth=1.5, markersize=4) 
plt.pause(0.0001) 

溶液张贴在这里: Matplotlib ion() and subprocesses