通过迭代更新图形,matplotlib

时间:2017-04-23 15:35:55

标签: numpy matplotlib

我试图通过迭代逐个绘制数据集的特征。 所以我希望图表能够在循环中不断更新。

我参考了这个帖子,real-time plotting in while loop with matplotlib但是答案到处都是,尽管如下所示加入了他们的一些建议,我仍然无法使代码正常工作。我正在使用Jupyter Notebook。

import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
colors = ["darkblue", "darkgreen"]

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True, sharex = True)


for i in range(X.shape[-1]-1):
    idx = np.where(y == 1)[0]
    ax1.scatter(X[idx, i], X[idx, i+1], color=colors[0], label=1)


    idx = np.where(y == 0)[0]
    ax2.scatter(X[idx, i], X[idx, i+1], color=colors[1], label=0)

    plt.draw()
    plt.pause(0.0001)

有什么建议吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

对于动画,您需要一个交互式后端。 %matplotlib inline不是交互式后端(它基本上显示了该图的打印版本)。

您可能决定不在jupyter中运行代码,而是作为脚本运行。在这种情况下,您需要将plt.ion()置于交互模式上。

另一种选择是使用FuncAnimation,例如this example。要在Jupyter中运行此类FuncAnimation,您仍需要一些交互式后端,%matplotlib tk%matplotlib notebook

从matplotlib 2.1开始,我们还可以使用JavaScript创建动画。

from IPython.display import HTML
HTML(ani.to_jshtml())

一些完整的例子:

import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np

t = np.linspace(0,2*np.pi)
x = np.sin(t)

fig, ax = plt.subplots()
ax.axis([0,2*np.pi,-1,1])
l, = ax.plot([],[])

def animate(i):
    l.set_data(t[:i], x[:i])

ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))

from IPython.display import HTML
HTML(ani.to_jshtml())

答案 1 :(得分:2)

这是Jupyter笔记本中实时绘图的示例

%matplotlib inline
%load_ext autoreload  #Reload all modules every time before executing the Python code typed.
%autoreload 2 
%matplotlib notebook

import matplotlib.pyplot as plt
import numpy as np
import time

colors = ["darkblue", "darkgreen"]

# initialise the graph and settings

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = fig.add_subplot(211)
plt.ion() # interactive mode
fig.show()
fig.canvas.draw() # matplotlib canvas drawing

# plotting loop

for i in range(X.shape[-1]-1):
  ax1.clear()
  ax2.clear()

  idx = np.where(y == 1)[0]
  ax1.scatter(X[idx, i], X[idx, i+1], color=colors[0], label=1)

  idx = np.where(y == 0)[0]
  ax2.scatter(X[idx, i], X[idx, i+1], color=colors[1], label=0)

  fig.canvas.draw() # draw
  time.sleep(0.5)   # sleep