Matlab与Python绘图差异:如何编写等效Matlab的Python代码?
Matlab转Python绘图问题修正
任务一:FFT功率谱绘图错误
错误点:
- 功率谱计算逻辑错误:Matlab中
pyy = z.*conj(z) / 512是计算信号的功率谱(幅度平方除以FFT点数),但Python代码写成了pyy = np.conj(z) / 512,缺少与z的相乘操作,导致结果为复数且完全不符合功率谱定义。 - 信号源不匹配:Python中的
sin_func未按Matlab逻辑生成,需要和y = sin(a*t) + 2*sin(b*t) + 1.5*sin(c*t)保持一致。 - FFT结果未做合理可视化处理:Matlab的FFT结果是对称的,通常只需展示前半部分正频率区间,且需确保结果为实数。
修正后的Python代码:
import numpy as np import matplotlib.pyplot as plt def print_two_graph(): # 生成与Matlab一致的输入信号 t = np.arange(-10, 10.1, 0.1) # 对应Matlab的-10:0.1:10 a, b, c = 1, 2, 3 # 可替换为自定义输入值 sin_func = np.sin(a * t) + 2 * np.sin(b * t) + 1.5 * np.sin(c * t) z = np.fft.fft(sin_func, 512) # 正确计算功率谱,取real避免浮点误差导致的虚部 pyy = (z * np.conj(z)).real / 512 plt.subplot(2, 1, 1) plt.plot(sin_func, 'green') plt.title('原始信号') plt.subplot(2, 1, 2) # 只展示前半部分正频率区间,符合常规可视化习惯 plt.plot(pyy[:256], 'red') plt.title('FFT功率谱') plt.tight_layout() plt.show()
任务二:指数函数双刻度绘图错误
错误点:
- 横轴不匹配:Matlab中
plot(y)以x为横轴,而Python代码里plt.plot(exp_func)默认用0起始的索引作为横轴,导致两条曲线的横轴范围不一致。 - 图例缺失:Matlab代码添加了曲线标注,Python代码未对应添加,且未明确线性/对数刻度曲线的对应关系。
- 绘图逻辑混淆:未确保两条曲线在同一坐标系下的展示逻辑与Matlab一致。
修正后的Python代码:
import numpy as np import matplotlib.pyplot as plt def print_exp_graph(): x_range = np.arange(1.0, 10.0, 0.1) exp_func = np.exp(x_range) plt.subplot(1, 1, 1) # 统一用x_range作为横轴,和Matlab逻辑对齐 plt.plot(x_range, exp_func, label='标准函数') plt.semilogy(x_range, exp_func, label='对数函数') plt.legend() plt.title('指数函数线性与对数刻度对比') plt.show()
内容的提问来源于stack exchange,提问作者Денис Попков
相关产品推荐
相关产品推荐

