2

I use matplotlib to animate a plot, by copying the background and blitting:

f = Figure(tight_layout=True)
canvas = FigureCanvasTkAgg(f, master=pframe)
canvas.get_tk_widget().pack()
ax = f.add_subplot(111)
# Set inial plot title
title = ax.set_title("First title")
canvas.show()
# Capture the background of the figure
background = canvas.copy_from_bbox(ax.bbox)
line, = ax.plot(x, y)
canvas._tkcanvas.pack()

Periodically I update the plot:

# How to update the title here?
line.set_ydata(new_data)
ax.draw_artist(line)
canvas.blit(ax.bbox)

How could I update -- as efficiently as possible, the plot title every time I update the plot?

Edit:

title.set_text("New title")
ax.draw_artist(title)

either before or after

canvas.blit(ax.bbox)

does not update the title. I think somehow I should redraw the title artist, or I should only capture the graph, as blit(ax.bbox) overwrites the entire title plot area including the title.

Eugen Epure
  • 21
  • 1
  • 3

2 Answers2

1

Swooping in years later to say that I too was stuck on this problem for the last few days, and disabling blit wasn't an option for me (as the fps would become way too slow). For matplotlib 3.1.3 at least, if you send a resize event to the canvas, it properly flushes the background and regenerates it with any updates. So you can work around this by detecting when you need to update the title, and then calling fig.canvas.resize_event() to force a flush. Hope this helps future people!

bream
  • 128
  • 12
-2

The following draws the plot and allows you to make changes,

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(1,1)
ax.plot(np.linspace(0.,10.,100))
title = ax.set_title("First title")
plt.show(block=False)

The title can then be updated using,

title.set_text("Second title")
plt.draw()
Ed Smith
  • 12,716
  • 2
  • 43
  • 55
  • Thanks! Of course this works, but `plt.draw()` is very inefficient. I try to copy the background and use `canvas.blit(ax.bbox)` (this updates the plot at least 10-20 times faster), the problem is the title is not updated in this case, even if I call `ax.draw_artist(title)` . – Eugen Epure Sep 28 '16 at 21:11
  • Hi @Eugen Epure, I'd guess `blit` doesn't assume the title will be change. It may be better to use text with `title = plt.text(5,11,'Second title')` to specify the title manually and then update this. I would think blitting works with text objects. – Ed Smith Sep 29 '16 at 09:00