Cha*_*xon 5 python matplotlib subplot
我正在尝试对两个图进行编码,使一个图位于另一个图的下方。然而,我的代码不断将我的两个图相互对齐。这是我的代码:
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()Run Code Online (Sandbox Code Playgroud)
我努力了:
plt.subplot(x)
plt.subplot(y)
plt.show()Run Code Online (Sandbox Code Playgroud)
但我遇到了这个错误:
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
>>> Run Code Online (Sandbox Code Playgroud)
我应该如何解决这两个问题?替代解决方案同样受到赞赏 - 我对如何创建绘图没有偏好;我只想一个在另一个之下。谢谢你!
数字在子图中的工作方式是,首先提供行数,然后提供列数。要使绘图相互重叠,您需要 2 行和 1 列。因此你首先要写2,然后写1plt.subplots(2, 1)
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
Run Code Online (Sandbox Code Playgroud)
来自官方文档
matplotlib.pyplot.subplots(nrows=1,ncols=1,sharex=False,sharey=False,squeeze=True,subplot_kw=None,gridspec_kw=None,**fig_kw)
您现在的显示方式是 1 行和 2 列,这就是您看到它们彼此相邻的原因。
第二种方法是使用subplotwhere211表示具有 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')
Run Code Online (Sandbox Code Playgroud)