Reputation: 129
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
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
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