我试图使用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造成这个问题的原因,请告诉我!
答案 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()语句,一切都会在预期的时候出现。
您的里程可能会有所不同。