81

Is there an explicit equivalent command in Python's matplotlib for Matlab's hold on? I'm trying to plot all my graphs on the same axes. Some graphs are generated inside a for loop, and these are plotted separately from su and sl:

import numpy as np
import matplotlib.pyplot as plt

for i in np.arange(1,5):
    z = 68 + 4 * np.random.randn(50)
    zm = np.cumsum(z) / range(1,len(z)+1)
    plt.plot(zm)
    plt.axis([0,50,60,80])

plt.show()

n = np.arange(1,51)
su = 68 + 4 / np.sqrt(n)
sl = 68 - 4 / np.sqrt(n)

plt.plot(n,su,n,sl)

plt.axis([0,50,60,80])
plt.show()
Medulla Oblongata
  • 3,771
  • 8
  • 36
  • 75

5 Answers5

62

Just call plt.show() at the end:

import numpy as np
import matplotlib.pyplot as plt

plt.axis([0,50,60,80])
for i in np.arange(1,5):
    z = 68 + 4 * np.random.randn(50)
    zm = np.cumsum(z) / range(1,len(z)+1)
    plt.plot(zm)    

n = np.arange(1,51)
su = 68 + 4 / np.sqrt(n)
sl = 68 - 4 / np.sqrt(n)

plt.plot(n,su,n,sl)

plt.show()
Alvaro Fuentes
  • 16,937
  • 4
  • 56
  • 68
  • 8
    Note: This doesn't work in the case of interactive input from the command line. Works fine if run within a script. – ZZZ Jul 21 '17 at 20:25
23

You can use the following:

plt.hold(True)
mapsa
  • 464
  • 4
  • 5
19

The hold on feature is switched on by default in matplotlib.pyplot. So each time you evoke plt.plot() before plt.show() a drawing is added to the plot. Launching plt.plot() after the function plt.show() leads to redrawing the whole picture.

freude
  • 3,632
  • 3
  • 32
  • 51
  • 1
    How would you get around this when using IPython? – ThatNewGuy Apr 06 '21 at 12:11
  • 1
    use backend %matplotlib inline and all plt.plot() within one cell will be output in the same frame. If you put plt.show() between plt.plot() functions within a cell it will create more frames, new one for each plt.show() – freude Apr 07 '21 at 04:45
0

check pyplot docs. For completeness,

import numpy as np
import matplotlib.pyplot as plt

#evenly sampled time at 200ms intervals
t = np.arange(0., 5., 0.2)

# red dashes, blue squares and green triangles
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()
CKM
  • 1,911
  • 2
  • 23
  • 30
0

Use plt.sca(ax) to set the current axes, where ax is the Axes object you'd like to become active.

For example:

In a first function: import numpy as np import matplotlib.pyplot as plt

for i in np.arange(1,5):
    z = 68 + 4 * np.random.randn(50)
    zm = np.cumsum(z) / range(1,len(z)+1)
    plt.plot(zm)
    plt.axis([0,50,60,80])

plt.show()

In the next function: def function2(...., ax=None)

if ax is None:
    fig, ax = plt.subplots(1)
else:
    plt.sca(ax)

n = np.arange(1,51)
su = 68 + 4 / np.sqrt(n)
sl = 68 - 4 / np.sqrt(n)

plt.plot(n,su,n,sl)

plt.axis([0,50,60,80])
plt.show()