13

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?

2 Answers 2

16

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)
Sign up to request clarification or add additional context in comments.

Comments

0
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.

1 Comment

But notice I'm not replotting my data, only changing it. If we use plt.cla() here, it clears my plot too, and only the text persists.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.