How do I plot 3 subplots in the same display window? python

37,666

Well...It looks like you are doing the plotting part correctly. The code below gives you the figure further below.

from pylab import *
subplot(3,1,1)
plot(arange(33))
subplot(3,1,2)
plot(arange(44))
subplot(3,1,3)
plot(arange(55),'r')

enter image description here

Your code does have some problems though, the first thing I found was that your t and x vectors aren't the same size.

Share:
37,666
Randy
Author by

Randy

Updated on December 10, 2020

Comments

  • Randy
    Randy over 3 years
    # Import plotting routines
    from pylab import *
    
    # 1D ODE that has a pitchfork bifurcation
    # x_dot = r * x - x * x * x
    def PitchforkODE(r,x):
    return r * x - x * x * x
    
    # 1D Euler
    def OneDEuler(r,x,f,dt):
        return x + dt * f(r,x)
    
    # Improved 1D Euler
    def ImprovedOneDEuler(r,x,f,dt):
    xtemp = x + dt * f(r,x)
    return x + dt * ( f(r,x) + f(r,xtemp) ) / 2.0
    
    # 4th Order Runge-Kutta Euler Method
    def RKOneD(r,x,f,dt):
    k1 = dt * f(r,x)
    k2 = dt * f(r,x + k1/2.0)
    k3 = dt * f(r,x + k2/2.0)
    k4 = dt * f(r,x + k3)
    return x + ( k1 + 2.0 * k2 + 2.0 * k3 + k4 ) / 6.0
    
    # Integrator function that calls one of the three functions
    # Fills up array
    def Integrator(x1,x2,x3,x4,t,N,Func,dt):
        for n in xrange(0,N):
            x1.append( Func(r,x1[n],PitchforkODE,dt) )
            x2.append( Func(r,x2[n],PitchforkODE,dt) )
            x3.append( Func(r,x3[n],PitchforkODE,dt) )
            x4.append( Func(r,x4[n],PitchforkODE,dt) )
            t.append( t[n] + dt )
    
    # Simulation parameters
    # Integration time step
    dt = 0.2
    
    
    # Control parameter of the pitchfork ODE:
    r = 1.0
    
    # Set up arrays of iterates for four different initital conditions
    x1 = [ 0.1]
    x2 = [-0.1]
    x3 = [ 2.1]
    x4 = [-2.1]
    x5 = [ 0.1]
    x6 = [-0.1]
    x7 = [ 2.1]
    x8 = [-2.1]
    x9 = [ 0.1]
    x10 = [-0.1]
    x11 = [ 2.1]
    x12 = [-2.1]
    
    # Time
    t  = [ 0.0]
    
    # The number of time steps to integrate over
    N = 50
    
    #The different functions
    a = OneDEuler
    b = ImprovedOneDEuler
    c = RKOneD
    
    # Setup the plot
    subplot(3,1,1)
    Func = a
    Integrator(x1,x2,x3,x4,t,N,Func,dt)
    ylabel('x(t)') # set y-axis label
    title(str(Func.func_name) + ': Pitchfork ODE at r= ' + str(r)) # set plot title
    axis([0.0,dt*(N+1),-2.0,2.0])
    # Plot the time series
    plot(t,x1,'b')
    plot(t,x2,'r')
    plot(t,x3,'g')
    plot(t,x4,'m')
    
    subplot(212)
    Func = b
    Integrator(x5,x6,x7,x8,t,N,Func,dt)
    ylabel('x(t)') # set y-axis label
    title(str(Func.func_name) + ': Pitchfork ODE at r= ' + str(r)) # set plot title
    axis([0.0,dt*(N+1),-2.0,2.0])
    # Plot the time series
    plot(t,x5,'b')
    plot(t,x6,'r')
    plot(t,x7,'g')
    plot(t,x8,'m')
    
    subplot(3,1,3)
    Func = c
    Integrator(x9,x10,x11,x12,t,N,Func,dt)
    xlabel('Time t') # set x-axis label
    ylabel('x(t)') # set y-axis label
    title(str(Func.func_name) + ': Pitchfork ODE at r= ' + str(r)) # set plot title
    axis([0.0,dt*(N+1),-2.0,2.0])
    # Plot the time series
    plot(t,x9,'b')
    plot(t,x10,'r')
    plot(t,x11,'g')
    plot(t,x12,'m')  
    

    I'm trying to plot 3 different subplots on the same display window. One on top of the other. So basically, 3 rows 1 column. Each plot represents a different function a, b or c. Each plot should have 4 different lines.