Change matplotlib.pyplot text() object properties


Question

I have a matplotlib.pyplot graph that updates in a loop to create an animation, using this kind of code that I got from another answer:

import matplotlib.pyplot as plt    
fig, ax = plt.subplots()    
x = [1, 2, 3, 4] #x-coordinates
y = [5, 6, 7, 8] #y-coordinates

for t in range(10):
    if t == 0:
        points, = ax.plot(x, y, marker='o', linestyle='None')
    else:
        new_x = ... # x updated
        new_y = ... # y updated
        points.set_data(new_x, new_y)
    plt.pause(0.5)

Now I want to put a plt.text() on the plot which will show the time that has passed. Putting a plt.text() statement inside the loop, however, creates a new text object at every iteration, putting them all on top of each other. So I must create only one text object at the first iteration, then modify it in subsequent iterations. Unfortunately, I cannot find in any documentation how to modify the properties of an instance of this object (it's a matplotlib.text.Text object) once it is created. Any help?

1
9
5/23/2017 11:54:26 AM

Accepted Answer

Similar as set_data you can use set_text (see here for the documentation: http://matplotlib.sourceforge.net/api/artist_api.html#matplotlib.text.Text.set_text).

So first

text = plt.text(x, y, "Some text")

and then in the loop:

text.set_text("Some other text")

In your example it could look like:

for t in range(10):
    if t == 0:
        points, = ax.plot(x, y, marker='o', linestyle='None')
        text = plt.text(1, 5, "Loops passed: 0")
    else:
        new_x = ... # x updated
        new_y = ... # y updated
        points.set_data(new_x, new_y)
        text.set_text("Loops passed: {0}".format(t))
    plt.pause(0.5)
15
6/11/2012 12:18:24 PM

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

x = [1, 2, 3, 4]
y = [5, 6, 7, 8]

for t in range(10):
    plt.cla()
    plt.text(4.6,6.7,t)
    x = np.random.randint(10, size=5)
    y = np.random.randint(10, size=5)

    points, = ax.plot(x, y, marker='o', linestyle='None')
    ax.set_xlim(0, 10)     
    ax.set_ylim(0, 10) 
    plt.pause(0.5)

Notice the plt.cla() call. It clears the screen.


Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon