10

I have a jupyter notebook and wish to create a plot in one cell, then write some markdown to explain it in the next, then set the limits and plot again in the next. This is my code so far:

# %%
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi)
y = np.sin(x ** 2)

plt.plot(x, y);

# %%
Some markdown text to explain what's going on before we zoom in on the interesting bit

# %%
plt.xlim(xmax=2);

The start of each cell is marked # %% above. The third cell shows an empty figure.

I'm aware of plt.subplots(2) to plot 2 plots from one cell but this does not let me have markdown between the plots.

Thanks in advance for any help.

blokeley
  • 6,726
  • 9
  • 53
  • 75

2 Answers2

8

This answer to a similar question says you can reuse your axes and figure from a previous cell. It seems that if you just have figure as the last element in the cell it will re-display its graph:

# %%
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi)
y = np.sin(x ** 2)

fig, ax = plt.subplots()
ax.plot(x, y);
fig  # This will show the plot in this cell, if you want.

# %%
Some markdown text to explain what's going on before we zoom in on the interesting bit

# %%
ax.xlim(xmax=2);  # By reusing `ax`, we keep editing the same plot.
fig               # This will show the now-zoomed-in figure in this cell.
Community
  • 1
  • 1
NHDaly
  • 7,390
  • 4
  • 40
  • 45
  • 3
    If you are using `pandas`, the plotting functions return `matplotlib Axes` objects. You can do things like `ax = df.plot()`, then in a later cell, `ax.get_figure()` and this will replot the figure – blokeley Feb 26 '17 at 19:49
  • 'AxesSubplot' object has no attribute 'xlim'. You must use `ax.set_xlim((min, max))` – joaquin Nov 26 '21 at 20:39
2

Easiest thing I can think of is to extract the plotting into a function that you can call twice. On the 2nd call you can then also call plt.xlim to zoom in. So something like (using you %% notation for new cells):

# %%
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

# %%
def make_plot():
    x = np.linspace(0, 2 * np.pi)
    y = np.sin(x ** 2)
    plt.plot(x, y);

make_plot()

# %%
Some markdown text to explain what's going on before we zoom in on the interesting bit

# %%
make_plot()
plt.xlim(xmax=2)
Oliver Dain
  • 9,617
  • 3
  • 35
  • 48
  • It is straightforward I guess! I thought others would have had the same need and there be some way of keeping the figure alive between cells but maybe not. Thanks for your answer. I'll mark it answered if no one else chips in soon. – blokeley Jan 09 '17 at 17:53