(1)本文使用Python绘制水平垂直方向振动信号图以及全寿命周期振动信号图,供大家学习参考。

(2)XJTU-SY 轴承数据集已上传至国内外各大主流云存储平台,实现开放获取,读者可通过以下链接自行下载分析 http://biaowang.tech/xjtu-sy-bearing-datasets

(3) 数据使用者应引用以下论文

WANG Biao , LEI Yaguo , LI Naipeng , et al. A hybrid prognostics approach for estimating remaining useful life of rolling element bearings[J]. IEEE Transactions on Reliability, 2018:1-12.

(4)遍历数据文件绘制每个csv文件水平垂直振动信号图

import os
import glob
import numpy as np
import matplotlib.pyplot as plt

# 设置全局字体
plt.rcParams['font.family'] = 'Times New Roman'

# 数据路径
base_path = r'D:\剩余寿命预测RUL\XJTU-SY_Bearing_Datasets\Data\XJTU-SY'
save_path = os.path.join(base_path, 'Vibration Figure')

# 创建保存目录
os.makedirs(save_path, exist_ok=True)

# 获取 Condition_X 文件夹
condition_folders = glob.glob(os.path.join(base_path, 'Condition_*'))

# 遍历每个工况
for condition_folder in condition_folders:
    condition_name = os.path.basename(condition_folder)
    bearing_folders = glob.glob(os.path.join(condition_folder, 'Bearing*'))

    # 遍历每个轴承
    for bearing_folder in bearing_folders:
        bearing_name = os.path.basename(bearing_folder)
        csv_files = glob.glob(os.path.join(bearing_folder, '*.csv'))

        if not csv_files:
            print(f'⚠️ 未找到 CSV 文件: {bearing_folder}')
            continue

        # 遍历 CSV 文件
        for csv_file in csv_files:
            file_name = os.path.basename(csv_file)

            try:
                # 读取 CSV 文件(检查前 5 行)
                data = np.genfromtxt(csv_file, delimiter=',', skip_header=1)

                if data.shape[1] != 2:
                    print(f'⚠️ 文件 {csv_file} 数据格式异常: 预期 2 列, 但得到 {data.shape[1]} 列')
                    continue

                print(f'✅ 读取 {csv_file}, 形状: {data.shape}')

                # 创建包含两个子图的图形
                fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(16, 4))

                # 左侧子图:绘制水平振动信号
                ax1.plot(data[:, 0], label='Horizontal Vibration', color='b')
                ax1.set_title(f'Horizontal Vibration', fontdict={'family': 'SimSun', 'size': 14}, family=["Times New Roman", "SimSun"])
                ax1.set_xlabel('Time (s)', fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
                ax1.set_ylabel('Vibration Amplitude (m/s²)', fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
                ax1.grid(True)

                # 右侧子图:绘制垂直振动信号
                ax2.plot(data[:, 1], label='Vertical Vibration', color='b')
                ax2.set_title(f'Vertical Vibration', fontdict={'family': 'SimSun', 'size': 14}, family=["Times New Roman", "SimSun"])
                ax2.set_xlabel('Time (s)', fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
                ax2.set_ylabel('Vibration Amplitude (m/s²)', fontdict={'family': 'SimSun', 'size': 12}, family=["Times New Roman", "SimSun"])
                ax2.grid(True)

                # 修改这里:设置整体标题
                plt.suptitle(f'{condition_name} - {bearing_name} - {file_name}',fontsize=15,family='Times New Roman')

                # 自动调整子图位置,避免标签重叠
                fig.tight_layout(rect=[0, 0, 1, 0.96])  # 保证标题和子图不重叠

                # 保存图像
                save_folder = os.path.join(save_path, condition_name, bearing_name)
                os.makedirs(save_folder, exist_ok=True)

                save_png = os.path.join(save_folder, f'{file_name}.png')
                save_svg = os.path.join(save_folder, f'{file_name}.svg')

                plt.savefig(save_png, dpi=600, bbox_inches='tight')
                plt.savefig(save_svg, format='svg', bbox_inches='tight')
                plt.close()

            except Exception as e:
                print(f'❌ 读取 {csv_file} 失败: {e}')

print("✅ 所有图像处理完成!")

(5)绘制XJTU-SY轴承全寿命周期振动信号

import os
import glob
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 设置全局字体
plt.rcParams['font.family'] = 'Times New Roman'

# 定义新数据集的基路径
base_path = r'D:\剩余寿命预测RUL\XJTU-SY_Bearing_Datasets\Data\XJTU-SY'
save_path = os.path.join(base_path, 'Life_Cycle_Figures')

# 如果保存路径不存在,则创建
if not os.path.exists(save_path):
    os.makedirs(save_path)

# 遍历所有工况文件夹(Condition_1, Condition_2, Condition_3)
condition_folders = glob.glob(os.path.join(base_path, 'Condition_*'))

# 遍历每个工况
for condition_folder in condition_folders:
    condition_name = os.path.basename(condition_folder)

    # 遍历该工况下的所有轴承文件夹(Bearing1_1, Bearing1_2, ...)
    bearing_folders = glob.glob(os.path.join(condition_folder, 'Bearing*'))

    for bearing_folder in bearing_folders:
        bearing_name = os.path.basename(bearing_folder)
        print(f"Processing {condition_name} - {bearing_name}...")

        # 获取当前轴承的所有CSV数据文件(按文件名排序,保证时间顺序)
        csv_files = sorted(glob.glob(os.path.join(bearing_folder, '*.csv')),
                           key=lambda x: int(os.path.basename(x).split('.')[0]))

        # 存储所有数据
        horizontal_data = []
        vertical_data = []

        # 读取所有 CSV 文件
        for csv_file in csv_files:
            df = pd.read_csv(csv_file)  # 读取 CSV
            if df.shape[1] < 2:
                print(f"⚠️ 警告:文件 {csv_file} 列数不足,跳过此文件!")
                continue

            data = df.to_numpy()  # 转换为 numpy 数组
            horizontal_data.append(data[:, 0])  # 第一列:水平振动
            vertical_data.append(data[:, 1])  # 第二列:垂直振动

        if not horizontal_data or not vertical_data:
            print(f"❌ 错误:{condition_name} - {bearing_name} 没有有效数据,跳过绘图!")
            continue

        # 合并所有数据,形成完整的寿命周期
        horizontal_data = np.concatenate(horizontal_data)
        vertical_data = np.concatenate(vertical_data)

        # 绘制完整寿命周期振动信号图
        plt.figure(figsize=(10, 8))
        plt.subplot(211)
        plt.plot(horizontal_data, color='#2632cd')
        plt.title(f'{condition_name} - {bearing_name} 水平振动信号', fontdict={'family': 'SimSun', 'size': 14})
        plt.xlabel(r'时间 (s)', fontdict={'family': 'SimSun', 'size': 12})
        plt.ylabel(r'振动幅值 (m/s²)', fontdict={'family': 'SimSun', 'size': 12})
        plt.xticks(fontname='Times New Roman')
        plt.yticks(fontname='Times New Roman')

        plt.subplot(212)
        plt.plot(vertical_data, color='#2632cd')
        plt.title(f'{condition_name} - {bearing_name} 垂直振动信号', fontdict={'family': 'SimSun', 'size': 14})
        plt.xlabel(r'时间 (s)', fontdict={'family': 'SimSun', 'size': 12})
        plt.ylabel(r'振动幅值 (m/s²)', fontdict={'family': 'SimSun', 'size': 12})
        plt.xticks(fontname='Times New Roman')
        plt.yticks(fontname='Times New Roman')

        plt.tight_layout()

        # 保存图像
        save_fig_path = os.path.join(save_path, f'{condition_name}_{bearing_name}_life_cycle.png')
        save_svg_path = os.path.join(save_path, f'{condition_name}_{bearing_name}_life_cycle.svg')
        plt.savefig(save_fig_path, dpi=600, bbox_inches='tight')
        plt.savefig(save_svg_path, dpi=600, bbox_inches='tight')
        plt.close()

print("✅ 所有轴承全寿命周期遍历图绘制完成!")

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐