As referred in this question, I am trying to update a plot dynamically in an iPython notebook (in one cell). The difference is that I don't want to plot new lines, but that my x_data and y_data are growing at each iteration of some loop.
What I'd like to do is:
import numpy as np
import time
plt.axis([0, 10, 0, 100]) # supoose I know what the limits are going to be
plt.ion()
plt.show()
x = []
y = []
for i in range(10):
x = np.append(x, i)
y = np.append(y, i**2)
# update the plot so that it shows y as a function of x
time.sleep(0.5)
but I want the plot to have a legend, and if I do
from IPython import display
import time
import numpy as np
plt.axis([0, 10, 0, 100]) # supoose I know what the limits are going to be
plt.ion()
plt.show()
x = []
y = []
for i in range(10):
x = np.append(x, i)
y = np.append(y, i**2)
plt.plot(x, y, label="test")
display.clear_output(wait=True)
display.display(plt.gcf())
time.sleep(0.3)
plt.legend()
I end up with a legend which contains 10 items. If I put the plt.legend()
inside the loop, the legend grows at each iteration... Any solution?
Currently, you are creating a new Axes object for every time you
plt.plot
in the loop.So, if you clear the current axis (
plt.gca().cla()
) before you useplt.plot
, and put the legend inside the loop, it works without the legend growing each time:EDIT: As @tcaswell pointed out in comments, using the
%matplotlib notebook
magic command gives you a live figure which can update and redraw.