I am trying to plot a live signal using matplotlib and it really drives me crazy. I have tried dozens of variants, with and without interactive (plt.ion()), with animation.FuncAnimation and doing things by hand, calling plt.show() and/or plt.draw() but nothing works as expected. One problem is that running commands in the interactive python shell behaves differently from the behavior when using the same commands in a script, so trying out different versions is very confusing.
I'd like to do something like this: fig, ax = plt.subplots() ival = .1 now = 0 t = list(numpy.linspace(now, now, 500)) y = [0] * len(t) while True: time.sleep(ival) now += ival val = get_sample_from_some_signal() t = t[1:] + [now] y = y[1:] + [val] ax.clear() ax.plot(t, y) plt.pause(1e-9) This works but is *very* slow and it seems the plot window is closed and opened again or raised for each new value to plot. I have tried to call plt.show(block=False) only once and then repeatedly only change data with ax.lines[0].set_xdata(), ax.lines[0].set_ydata(), and ax.set_xlim() and then calling plt.draw(). That works in the interactive python shell but not in a script. When calling set[xy]_data() and set_xlim() in an amimate() function passed to animation.FuncAnimation, but I haven't managed to redraw the x scale values (although ax.xlim() is called). Also, with animation.FuncAnimation() I loose control of the main thread of execution. When calling plt.show() the function doesn't return. I may want to change the loop so that instead of time.sleep(ival) val = get_sample_from_some_signal() I would have val = wait_for_next_same_from_some_signal() and I think this doesn't work with FuncAnimation since that calls the passed function with a fixed time interval. I am completely lost, can someone help? Steve -- https://mail.python.org/mailman/listinfo/python-list