How to rearrange subplots so that one is underneath the other?

Viewed 6080

I am trying to code two plots such that one plot is underneath the other. However, my code keeps aligning my two plots next to one another. This is my code:

import numpy as np
from scipy.integrate import odeint
from numpy import sin, cos, pi, array
import matplotlib
from matplotlib import rcParams
import matplotlib.pyplot as plt
from pylab import figure, axes, title, show
import xlsxwriter

plt.style.use('ggplot')

def deriv(z, t):
    l = 0.25    #unextended length of the spring, in m
    m = 0.25       #mass of the bob, in kg
    k = 29.43      #spring constant, in Nm^-1
    g = 9.81    #gravitational acceleration, in ms^-2
    
    x, y, dxdt, dydt = z
    
    dx2dt2 = (l+x)*(dydt)**2 - k/m*x + g*cos(y)
    dy2dt2 = (-g*sin(y) - 2*(dxdt)*(dydt))/(l+x)
            #equations of motion
    
    return np.array([dxdt, dydt, dx2dt2, dy2dt2])


init = array([0, pi/2, 0, 0])
            #initial conditions (x, y, xdot, ydot)

time = np.linspace(0, 10, 1000)
            #time intervals (start, end, number of intervals)

sol = odeint(deriv, init, time)
            #solving the equations of motion

x = sol[:,0]
y = sol[:,1]

fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True)

ax1.plot(time,x)
ax1.set_ylabel('hi')

ax2.plot(time,y)
ax2.set_ylabel('fds')

plt.plot()

but I keep getting this as a result: enter image description here

I have tried:

plt.subplot(x)
plt.subplot(y)
plt.show()

but I run into this error:

Traceback (most recent call last):
  File "/Users/cnoxon/Desktop/Python/Final code 2 copy 2.py", line 39, in <module>
    plt.subplot(x)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/matplotlib/pyplot.py", line 1084, in subplot
    a = fig.add_subplot(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/matplotlib/figure.py", line 1367, in add_subplot
    a = subplot_class_factory(projection_class)(self, *args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/matplotlib/axes/_subplots.py", line 39, in __init__
    s = str(int(args[0]))
TypeError: only size-1 arrays can be converted to Python scalars
>>> 

How should I go about solving either of these problems? Alternative solutions are equally appreciated - I have no preference as to how the plots are created; I just want one to be under the other. Thank you!

1 Answers

The way the numbers work in subplots is that first you provide the number of rows and then the number of columns. To have plots below each other, you need 2 rows and 1 column. Hence you first have to write 2 and then 1 in plt.subplots(2, 1)

fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)

From the official docs

matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)

The way you have it right now is 1 row and 2 columns, which is why you see them next to each others.

Second way is using subplot where 211 means a figure with 2 rows, 1 column and 1st subplot and 212 means 2 rows, 1 column and second subplot. So the first two digits specify the number of rows and columns and the third digit specifies the subplot number.

plt.subplot(211)
plt.plot(time,x)
plt.ylabel('hi')

plt.subplot(212)
plt.plot(time,y)
plt.ylabel('fds')

enter image description here

Related