MatPlotLib的ion()和draw()不起作用

时间:2016-02-05 02:30:21

标签: python loops real-time

我试图使用for循环实时绘制数字。我有以下简单的代码:

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.draw()替换为plt.show,则会实时输出多个数字,但我希望它们全部显示在同一个数字中。有什么想法吗?

编辑:
我用Anaconda下载了PyCharm,一切正常。我猜这是Spyder的一个问题,因为我尝试了几个不同的版本而没有成功。如果有任何人知道Spyder造成这个问题的原因,请告诉我!

4 个答案:

答案 0 :(得分:5)

根据您的情况改编:Python realtime plotting

@Component({
  (...)
  template: `
    <select [ngModel]="selectedDevice" (ngModelChange)="onChange($event)">
      <option *ngFor="#i of devices">{{i}}</option>
    </select>
  `)
  export class SomeComponent {

    onChange(newValue) {
      console.log(newValue);
      this.selectedDevice = newValue;
      // ... do other stuff here ...
    }
  }

答案 1 :(得分:1)

嘿我遇到了同样的问题,我检查了其他问题,当我将暂停插入我的解决方案时,我的问题就解决了。这是一些适合我的示例代码。

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

答案 2 :(得分:1)

此解决方案示例适用于多台计算机。尝试调整plt.pause(...)

import matplotlib.pyplot as plt
import numpy as np

F = lambda x: np.sin(2*x)

plt.ion()    
x = np.linspace(0, 1, 200)
plt.plot(x, F(x))


for i in range(100):
    if 'ax' in globals(): ax.remove()
    newx = np.random.choice(x, size = 10)
    ax = plt.scatter(newx, F(newx))
    plt.pause(0.05)

plt.ioff()
plt.show()

答案 3 :(得分:0)

问题和解决方案高度依赖于Python环境和后端中的plot.draw()函数,甚至在不同的产品版本中也可能有所不同。取决于环境,它以不同的方式表现出来。该问题在stackoverflow的许多地方都出现了,某些解决方案只对某些人有用,而对其他人不起作用。

我的Windows笔记本电脑上的黄金标准是从命令行运行Python-没有IDE,只有普通的Python3。如示例中所示,draw()在那里总是可以正常工作。

如果我在同一台计算机上的Jupyter笔记本电脑中尝试使用它,则draw(),plot.pause(),plot.show()或任何其他建议都无效。我用笔记本,小部件和ipympl尝试了%matplotlib。在单元代码执行完全结束之前,不会画出任何东西。

建议使用fig.canvas.flush_events()在stackoverflow上使用其他一些资源。我取得了一些成功,并进行了进一步的研究。

最好的解决方案是在图形。画布级别而不是轴或绘图级别运行draw()。

您可以通过使用以下命令创建图来获取图形:

fig, graph, = plt.subplots()

或者,如果您已经创建了情节(如票证顶部的代码中所示),则将以下内容放入循环之外:

fig = plt.gcf() #get current figure

在循环内部,使用

而不是plt.draw()
fig.canvas.draw()

在Jupyter Notebook环境中,即使在多个图形上运行多个轴/曲线时,它也被证明是可靠的。我可以放入sleep()语句,一切都会在预期的时候出现。

您的里程可能会有所不同。