matplotlib绘图报'tlim'属性不存在错误及多曲线合并绘制问题
报错原因
'Line2D' object has no property 'tlim' 报错根源是参数传错位置:
tlim/ylim不是plt.plot()的合法参数,这两个是坐标轴范围配置项,需要调用独立的方法设置,不能直接传入plot函数。- 原代码还有两个隐藏问题:一是sympy求解得到的
psol.rhs是符号表达式,不能直接被matplotlib识别绘图;二是末尾的plt.show没加括号,不会触发绘图窗口渲染。
修复方案
要把三条解曲线合并到同一张图,按以下步骤修改即可:
- 用
numpy.linspace生成自变量t在目标区间[0,10]的密集数值采样点 - 用sympy自带的
lambdify工具,把三个符号形式的特解转为支持numpy数组输入的数值计算函数,批量算出对应y值 - 调用
plt.plot()时只传入x、y数值数组,为三条曲线添加区分用的标签 - 单独调用
plt.xlim()、plt.ylim()设置坐标轴范围,补充图例、坐标轴标签后,加括号调用plt.show()渲染图像
修改后可直接运行的完整代码
import numpy as np from sympy import symbols, Function, Eq, dsolve, lambdify import matplotlib.pyplot as plt # 定义符号变量、函数与三类二阶齐次线性微分方程 t = symbols('t') y = symbols('y', cls=Function) deq1 = Eq(y(t).diff(t, 2) + 10*y(t).diff(t) + 9*y(t), 0) deq2 = Eq(y(t).diff(t, 2) + 6*y(t).diff(t) + 9*y(t), 0) deq3 = Eq(y(t).diff(t, 2) + y(t).diff(t) + 9*y(t), 0) # 代入统一初始条件求解特解 init_condition = {y(0): 0.16, y(t).diff(t).subs(t, 0): 0} psol1 = dsolve(deq1, ics=init_condition) psol2 = dsolve(deq2, ics=init_condition) psol3 = dsolve(deq3, ics=init_condition) # 符号解转数值函数,生成绘图用的采样数据 t_sample = np.linspace(0, 10, 1000) cal_y1 = lambdify(t, psol1.rhs, 'numpy') cal_y2 = lambdify(t, psol2.rhs, 'numpy') cal_y3 = lambdify(t, psol3.rhs, 'numpy') y1_sample = cal_y1(t_sample) y2_sample = cal_y2(t_sample) y3_sample = cal_y3(t_sample) # 同一画布绘制三条解曲线 plt.figure(figsize=(10, 6)) plt.plot(t_sample, y1_sample, label='过阻尼特征') plt.plot(t_sample, y2_sample, label='临界阻尼特征') plt.plot(t_sample, y3_sample, label='欠阻尼特征') # 配置图表样式 plt.xlim(0, 10) plt.ylim(-0.1, 0.15) plt.xlabel('时间 t') plt.ylabel('响应 y(t)') plt.legend() plt.grid(alpha=0.3) plt.show()
内容的提问来源于stack exchange,提问作者spg
相关产品推荐
相关产品推荐

