Plotting in a non-blocking way with Matplotlib

matplotlib, plot, python

Solution

I spent a long time looking for solutions, and found this answer.

It looks like, in order to get what you (and I) want, you need the combination of `plt.ion()`, `plt.show()` (not with `block=False`) and, most importantly, `plt.pause(.001)` (or whatever time you want). The pause is needed because the GUI events happen while the main code is sleeping, including drawing. It's possible that this is implemented by picking up time from a sleeping thread, so maybe IDEs mess with that—I don't know.

Here's an implementation that works for me on python 3.5:

import numpy as np
from matplotlib import pyplot as plt

def main():
    plt.axis([-50,50,0,10000])
    plt.ion()
    plt.show()

    x = np.arange(-50, 51)
    for pow in range(1,5):   # plot x^1, x^2, ..., x^4
        y = [Xi**pow for Xi in x]
        plt.plot(x, y)
        plt.draw()
        plt.pause(0.001)
        input("Press [enter] to continue.")

if __name__ == '__main__':
    main()

Problem

I am having problems trying to make matplotlib plot a function without blocking execution. I have tried using `show(block=False)` as some people suggest, but all I get is a frozen window. If I simply call `show()`, the result is plotted properly but execution is blocked until the window is closed. From other threads I've read, I suspect that whether `show(block=False)` works or not depends on the backend. Is this correct? My backend is Qt4Agg. Could you have a look at my code and tell me if you see something wrong? Here is my code. ``` from math import * from matplotlib import pyplot as plt print(plt.get_backend()) def main(): x = range(-50, 51, 1) for pow in range(1,5): # plot x^1, x^2, ..., x^4 y = [Xi**pow for Xi in x] print(y) plt.plot(x, y) plt.draw() #plt.show() #this plots correctly, but blocks execution. plt.show(block=False) #this creates an empty frozen window. _ = raw_input("Press [enter] to continue.") if __name__ == '__main__': main() ``` PS. I forgot to say that I would like to update the existing window every time I plot something, instead of creating a new one.

Original source

Related problems