Karnivaurus
Karnivaurus

Reputation: 24131

Displaying and updating a MatPlotLib graph without blocking execution

I want to plot a MatPlotLib.PyPlot graph, which is updated over time, and doesn't block program execution. I don't want the user to have to press a key to display the new graph each time it is updated.

I believe that plt.show(block=False) is required for what I want. However, my code does not perform as desired.

Here is my code:

import matplotlib.pyplot as plt
import time

def ShowGraph():
  n = 2
  while True:
    x = [i for i in range(n)]
    y = [i for i in range(n)]
    plt.plot(x, y, 'r-')
    plt.ylim([0, 10])
    plt.xlim([0, 10])
    plt.show(block=False)
    time.sleep(1)
    n += 1

ShowGraph()

This should plot a new graph every second, with the red line getting longer each time. However, all that shows is the graph after the first call to plt.show(). What am I doing wrong?

Upvotes: 1

Views: 2741

Answers (1)

Munir
Munir

Reputation: 3612

When I tried your code as is, it got stuck in an infinite loop. So, I have modified your code slightly to make it work.
Mainly, you need to update your graph using plt.draw() after the first iteration of your loop. plt.show() in non-interactive mode only shows the graph as is, does not update it even with block=False. You still need plt.draw() to update the figure.

import matplotlib.pyplot as plt
import time

def ShowGraph():
    n = 2
    j = 1
    while j <= 10:
        x = [i for i in range(n)]
        y = [i for i in range(n)]
        plt.plot(x, y, 'r-')
        plt.ylim([0, 10])
        plt.xlim([0, 10])
        if j > 1:
            plt.draw()
        else:
            plt.show(block=False)
        time.sleep(1)
        n += 1
        j += 1

ShowGraph()

Upvotes: 1

Related Questions