MatPlotLib 的 ion() 和 draw() 不工作

MatPlotLib's ion() and draw() not working

我正在尝试使用 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 中的这个问题,请告诉我!

根据您的情况改编自: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

嘿,我遇到了同样的问题,我检查了其他问题,当我在我的解决方案中插入一个暂停时,我的问题就解决了。这是一些对我有用的示例代码。

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

这个解决方案示例对我在多台机器上都有效。尝试调整 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()

问题 - 以及解决方案 - 高度依赖于 Python 环境和后端中的 plot.draw() 函数,甚至可能在不同的产品版本中有所不同。它会根据环境以不同的方式表现出来。这个问题出现在 Whosebug 上的许多地方,一些解决方案适用于某些人而不适用于其他人。

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

如果我在同一台机器上的 Jupyter notebook 中尝试,无论 draw()、plot.pause()、plot.show() 或任何其他建议都不起作用。我用笔记本、小部件和 ipympl 尝试了 %matplotlib。在单元代码执行完全结束之前,不会绘制任何内容。

Whosebug 上的一些其他来源建议使用 figure.canvas.flush_events()。我在这方面取得了一些成功并进行了进一步调查。

最好的解决方案是 运行 在 figure.canvas 级别而不是轴或绘图级别的 draw()。

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

fig, graph, = plt.subplots()

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

fig = plt.gcf() #get current figure

在循环内部,使用

代替plt.draw()
fig.canvas.draw()

它在我的 Jupyter Notebook 环境中被证明是可靠的,即使 运行在多个图形中使用多个 axes/plots 也是如此。我可以放入 sleep() 语句,一切都会按预期出现。

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