如何重新排列子图,使一个子图位于另一个子图下方?

4

我正在尝试编写两个图表,使得一个图表在另一个下方。然而,我的代码一直将这两个图表排列在一起。

以下是我的代码:

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()

但我一直得到这个结果:

enter image description here

我已经尝试过:

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

但是我遇到了这个错误:

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
>>> 

我该如何解决这些问题?如果有其他替代方案也可以,我不在意图表是如何创建的,只希望一个图表在另一个下面。谢谢!

2
您的调用 plt.subplots(1, 2, sharex=True) 表示要并排绘制(1 行 2 列),只需将 nrowsncols 参数翻转为 plt.subplots(2, 1, sharex=True) (2 行 1 列)。 - AChampion
1个回答

7
subplots 中,数字的运作方式是首先提供行数,然后是列数。如果要使图像在下方对齐,则需要 2 行和 1 列。因此,您需要先输入 plt.subplots(2, 1) 中的 2,然后再输入 1。
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)

来自官方文档

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

您现在的方式是1行2列,这就是为什么它们并排显示的原因。

第二种方法是使用subplot,其中211表示具有2行1列和第1个子图的图形,212表示具有2行1列和第二个子图。因此,前两位数字指定行数和列数,第三位数字指定子图编号。

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

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

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接