import matplotlib.pyplot as plt
import numpy as np
import sympy as spfrom sympy.utilities.lambdify import lambdify
#-----------------------------连续数值离散化-便于绘图------------------------------------
def Curve_values(piecewise_function):derivative_func = lambdify(x, piecewise_function, 'numpy')# 创建x值向量并计算导数值derivative_values = derivative_func(x_values)return derivative_values###########################绘制、美化坐标轴函数(start)################################################
'''
index:要绘制在第几行第几列,
由于在前面定义的是plt.subplots(3, 1)
也就是说只有一列,所以是axes[index],
表示在该单列的第几行画这个图。如果在前面定义的是plt.subplots(3,2)
那么就会是axes[index_x][index_y]
表示在第几行第几列画这个图。func:要绘制的函数名称
Curve_name:曲线名称
x_name:x轴名称
y_name:y轴名称
'''
def axes_draw(index,func,Curve_name,x_name,y_name):axes[index].plot(x_values, Curve_values(func), 'r', label = Curve_name)axes[index].set_xlabel(x_name)axes[index].set_ylabel(y_name)axes[index].legend()axes[index].grid(True)def beautify_axes(index):axes[index].spines['right'].set_color('none') # 将图像右边的轴设为透明axes[index].spines['top'].set_color('none') # 将图像上面的轴设为透明axes[index].xaxis.set_ticks_position('bottom') # 将x轴刻度设在下面的坐标轴上axes[index].yaxis.set_ticks_position('left') # 将y轴刻度设在左边的坐标轴上axes[index].spines['bottom'].set_position(('data', 0)) # 将两个坐标轴的位置设在数据点原点axes[index].spines['left'].set_position(('data', 0))################################绘制、美化坐标轴函数(end)###########################################if __name__ == '__main__':#-----------------------------分段函数S-t、V-t、a-t(Start)定义------------------------------------x = sp.symbols('x')s_t = sp.Piecewise((0.25*x, sp.And(x>=0,x<20)),(5, sp.And(x>=20,x<50)),(-1.0/3.0*(x-65),sp.And(x>50,x<=65)))#位移曲线v_t = sp.diff(s_t, x)#速度曲线 a_t = sp.diff(v_t, x)#加速度曲线 #-----------------------------分段函数S-t、V-t、a-t(End)------------------------------------#-----------------------------x轴定义域----------------------------left=0right=70x_values = np.linspace(left, right, 1000)#这个1000个曲线上的点,并不是刻度上的点#----------------------------------------------------------------------fig, axes = plt.subplots(3, 1, figsize = (8, 7))#两行两列总共4个图#############################绘制s-t##############################################index=0Curve_name='s-t Curve'x_name='Time(min)'y_name='Displacement(km)'axes_draw(index,s_t,Curve_name,x_name,y_name)beautify_axes(index)################################绘制v-t###########################################index=1Curve_name='v-t Curve'x_name='Time(min)'y_name='Velocity(km/min)'axes_draw(index,v_t,Curve_name,x_name,y_name)beautify_axes(index)################################绘制a-t###########################################index=2Curve_name='a-t Curve'x_name='Time(min)'y_name='Acceleration(km/min2)'axes_draw(index,v_t,Curve_name,x_name,y_name)beautify_axes(index)# plt.grid(True)plt.show()
运行结果如下: