import matplotlib.pyplot as plt import numpy as np import sympy as sp from 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=0 right=70 x_values = np.linspace(left, right, 1000)#这个1000个曲线上的点,并不是刻度上的点 #---------------------------------------------------------------------- fig, axes = plt.subplots(3, 1, figsize = (8, 7))#两行两列总共4个图 #############################绘制s-t############################################## index=0 Curve_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=1 Curve_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=2 Curve_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()
运行结果如下: