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

新手上路,请多包涵

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

原文由 Alex 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 753
2 个回答

适用于您的案例: Python 实时绘图

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

原文由 CoMartel 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 Jon 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题