Majid alDosari
Majid alDosari

Reputation: 129

why doesn't the text show up interactively

from Is there a way of drawing a caption box in matplotlib

from matplotlib import pyplot as plt
import numpy as np

x = np.arange(0,3,.25)
y = np.sin(x)
txt = '''
    Lorem ipsum dolor sit amet, consectetur adipisicing elit,
    sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
    nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
    reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
    pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
    culpa qui officia deserunt mollit anim id est laborum.'''

fig = plt.figure()
ax1 = fig.add_axes((.1,.4,.8,.5))
ax1.bar(x,y,.2)
fig.text(.1,.1,txt) #<-doesn't work interactively
#plt.show()

This code works if I run it as a script. But if I first run everything up to, but not including the fig.text line, then I input the fig.text line into the console, the txt doesn't show up in the figure! Why?

Upvotes: 0

Views: 1074

Answers (2)

tacaswell
tacaswell

Reputation: 87386

This is a feature, not a bug.

Redrawing the figure can be very computationally expensive so the OO interface does not force a re-draw of the figure. By deferring the expense of drawing you can greatly improve the performance of functions that make many calls to Figure and Axes methods. To get the figure on the screen to update to reflect the state of the you need to explicitly update it. You programmaticly force a re-draw via

fig.canvas.draw()

or

plt.draw()

which will redraw the 'current figure'. Resizing the window will cause the GUI framework to re-draw it's window which in turn triggers a full re-draw of the mpl figur.

When you use the pyplot functions (rather than the OO interface) a redraw is forced on every plotting command. This difference is because the pyplot interface is coupled with a state-machine (that keeps track of your current figure/axes) and was designed for interactive use, where as the OO interface (which the pyplot interface is built on top of) is designed for programmatic usage.

This is an annoyance that the devs are aware of and making this behave a bit more intuitively is on the near/mid term road map (see https://github.com/matplotlib/matplotlib/pull/3587 and the links there in).

Upvotes: 2

MattDMo
MattDMo

Reputation: 102862

Read through this information on interactive mode in matplotlib. It either needs to be turned on by default in your matplotlibrc file, set via matplotlib.interactive(), or turned on in your console by running plt.ion(), which is what I'd recommend here. In the long term, though, using a customized matplotlibrc file is your best bet.

Upvotes: -1

Related Questions