如何使用Python Matplotlib绘制CSV数据对应的未知类型图表?
Matplotlib实现目标图表的方案说明
你要绘制的是带时域波形预览的交叉谱密度(CSD)组合图,和你查阅的Matplotlib官方CSD示例属于同类型图表,只是额外增加了顶部的原始输入信号时域展示子图。
实现步骤
- 先读取你的CSV数据,默认CSV包含时间、信号1、信号2三列,用
pandas.read_csv()接口读取即可,若你的数据列结构不同,调整对应列的引用逻辑即可。 - 调用
plt.subplots()创建2行1列的组合子图,可设置上下子图共享x轴,保证时域和频域的坐标对应关系。 - 顶部子图分别绘制两个输入信号的时域曲线,用不同颜色区分,添加图例、y轴标签说明信号含义。
- 底部子图直接调用
matplotlib.pyplot.csd()接口计算并绘制交叉谱密度曲线,该接口支持自定义采样频率、FFT窗函数、重叠长度等参数,可根据你的数据属性调整。 - 调整子图间距,添加整体标题后可直接展示或导出图片。
示例代码
import numpy as np import matplotlib.pyplot as plt import pandas as pd # 1. 读取CSV数据,替换为你的实际文件路径 df = pd.read_csv("你的数据文件路径.csv") t = df.iloc[:, 0].values # 第一列为时间列 x1 = df.iloc[:, 1].values # 第二列为第一个信号列 x2 = df.iloc[:, 2].values # 第三列为第二个信号列 # 计算采样频率,可根据你的实际采样参数直接赋值 fs = 1 / np.mean(np.diff(t)) # 2. 创建组合子图 fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 7)) # 3. 绘制顶部时域信号 ax1.plot(t, x1, label="信号1", color="#1f77b4") ax1.plot(t, x2, label="信号2", color="#ff7f0e") ax1.set_ylabel("信号幅值") ax1.legend() ax1.grid(alpha=0.3) # 4. 绘制底部CSD曲线 cxy, freq = ax2.csd(x1, x2, Fs=fs, NFFT=1024, color="#2ca02c") ax2.set_ylabel("交叉谱密度 (dB/Hz)") ax2.set_xlabel("频率 (Hz)") ax2.grid(alpha=0.3) # 调整布局 plt.tight_layout() plt.show()
如果需要同时展示CSD的相位信息,可额外增加一个子图,通过np.angle(cxy)计算相位后绘制即可。
内容的提问来源于stack exchange,提问作者zaydoosh
相关产品推荐
相关产品推荐

