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() 语句,一切都会按预期出现。
您的里程可能会有所不同。
我正在尝试使用 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() 语句,一切都会按预期出现。
您的里程可能会有所不同。