🧑 博主简介:曾任某智慧城市类企业
算法总监
,目前在美国市场的物流公司从事高级算法工程师
一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个性化解决方案等服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:xf982831907
)
💬 博主粉丝群介绍:① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。
【数据可视化-83】环境因素对机器性能影响的深度可视化分析:Python + matplotlib打造炫酷数据大屏
一、引言
在工业生产中,机器的性能和故障率受到多种环境因素的影响。本文将利用 Python 和 matplotlib 对环境因素对机器性能的影响进行深度可视化分析。通过多种炫酷的图表,从多个维度深入剖析环境因素与机器性能之间的关系,最终生成一个可移动的可视化大屏,为数据分析和决策提供有力支持。
二、数据准备
本次分析的数据集包含以下字段:
footfall
:经过机器的人数或物体数量tempMode
:机器的温度模式或设置AQ
:机器附近的空气质量指数USS
:超声波传感器数据,表示接近度测量CS
:当前传感器读数,表示机器的电流使用情况VOC
:检测到的挥发性有机化合物水平RP
:机器部件的旋转位置或每分钟转数IP
:机器的输入压力Temperature
:机器的运行温度fail
:机器故障的二元指示器(1表示故障,0表示无故障)
以下是部分数据的展示:
footfall | tempMode | AQ | USS | CS | VOC | RP | IP | Temperature | fail |
---|---|---|---|---|---|---|---|---|---|
0 | 7 | 7 | 1 | 6 | 6 | 36 | 3 | 1 | 1 |
190 | 1 | 3 | 3 | 5 | 1 | 20 | 4 | 1 | 0 |
31 | 7 | 2 | 2 | 6 | 1 | 24 | 6 | 1 | 0 |
在进行可视化之前,我们需要对数据进行加载和清洗。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题
# 读取数据
df = pd.read_csv("data (1).csv")
# 查看数据的前几行
print(df.head())
三、可视化实现
3.1 环境因素与机器故障的关系(柱状图)
首先,我们通过柱状图展示不同环境因素与机器故障之间的关系。
# 创建柱状图
plt.figure(figsize=(12, 8))
sns.barplot(x=df.columns[1:-1], y=df[df['fail'] == 1].sum().tolist()[1:-1], label="故障次数")
sns.barplot(x=df.columns[1:-1], y=df[df['fail'] == 0].sum().tolist()[1:-1], label="正常次数")
plt.title("环境因素与机器故障的关系", fontsize=16)
plt.xlabel("环境因素", fontsize=14)
plt.ylabel("次数", fontsize=14)
plt.xticks(rotation=45)
plt.legend()
plt.show()
3.2 空气质量与机器故障的关系(散点图)
接下来,我们通过散点图展示空气质量(AQ)与机器故障之间的关系。
normal_data = df[df['fail'] == 0]
fault_data = df[df['fail'] == 1]
# 统计正常状态下的AQ分布
normal_aq_counts = normal_data['AQ'].value_counts().sort_index()
# 统计故障状态下的AQ分布
fault_aq_counts = fault_data['AQ'].value_counts().sort_index()
plt.figure(figsize=(15, 6))
# 绘制正常状态下的饼图
plt.subplot(1, 2, 1)
plt.pie(normal_aq_counts,
labels=normal_aq_counts.index,
autopct='%1.1f%%',
startangle=90)
plt.title('正常状态(fail=0)下的AQ分布', fontsize=14)
# 绘制故障状态下的饼图
plt.subplot(1, 2, 2)
plt.pie(fault_aq_counts,
labels=fault_aq_counts.index,
autopct='%1.1f%%',
startangle=90)
plt.title('故障状态(fail=1)下的AQ分布', fontsize=14)
plt.show()
3.3 机器运行温度与故障的关系(折线图)
我们再通过折线图展示机器运行温度与故障之间的关系。
plt.figure(figsize=(10, 6))
sns.lineplot(x='Temperature', y='fail', data=df, marker='o', color='red')
plt.title("机器运行温度与故障的关系", fontsize=16)
plt.xlabel("运行温度", fontsize=14)
plt.ylabel("故障状态", fontsize=14)
plt.show()
3.4 机器电流使用情况与故障的关系(箱线图)
通过箱线图展示机器电流使用情况(CS)与故障之间的关系。
plt.figure(figsize=(10, 6))
sns.boxplot(x='fail', y='CS', data=df, palette='viridis')
plt.title("机器电流使用情况与故障的关系", fontsize=16)
plt.xlabel("状态", fontsize=14)
plt.ylabel("电流使用情况", fontsize=14)
plt.xticks([0, 1], ["正常", "故障"])
plt.show()
3.5 机器输入压力与故障的关系(热力图)
通过热力图展示机器输入压力(IP)与故障之间的关系。
plt.figure(figsize=(10, 6))
sns.heatmap(df[['IP', 'fail']].corr(), annot=True, cmap='coolwarm', linewidths=.5)
plt.title("机器输入压力与故障的关系", fontsize=16)
plt.show()
3.6 机器旋转位置与故障的关系(雷达图)
通过雷达图展示机器旋转位置(RP)与故障之间的关系。
from math import pi
# 计算角度
categories = df.columns[1:-1].tolist()
N = len(categories)
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1]
# 准备数据
normal = df[df['fail'] == 0][categories].mean().tolist()
normal += normal[:1]
fault = df[df['fail'] == 1][categories].mean().tolist()
fault += fault[:1]
# 绘制雷达图
fig, ax = plt.subplots(figsize=(10, 6), subplot_kw=dict(polar=True))
ax.fill(angles, normal, color='blue', alpha=0.25)
ax.plot(angles, normal, color='blue', linewidth=2, label='正常')
ax.fill(angles, fault, color='red', alpha=0.25)
ax.plot(angles, fault, color='red', linewidth=2, label='故障')
ax.set_thetagrids([a * 180 / pi for a in angles[:-1]], categories)
plt.title("机器旋转位置与故障的关系", fontsize=16)
plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1.1))
plt.show()
3.7 挥发性有机化合物水平与故障的关系(饼图)
通过饼图展示挥发性有机化合物水平(VOC)与故障之间的关系。
plt.figure(figsize=(10, 6))
voc_groups = df.groupby('VOC')['fail'].mean().reset_index()
plt.pie(voc_groups['fail'], labels=voc_groups['VOC'].astype(str),
autopct='%1.1f%%', startangle=90)
plt.title('挥发性有机化合物水平与故障关系')
plt.show()
3.8 超声波传感器数据与故障的关系(面积图)
通过面积图展示超声波传感器数据(USS)与故障之间的关系。
plt.figure(figsize=(24, 8))
plt.fill_between(df.index[-100:], df['USS'][-100:], alpha=0.5, label='超声波传感器数据')
plt.fill_between(df.index[-100:], df['fail'][-100:], alpha=0.5, label='机器故障')
plt.title("超声波传感器数据与故障的关系", fontsize=16)
plt.xlabel("时间", fontsize=14)
plt.ylabel("值", fontsize=14)
plt.legend()
plt.show()
四、可视化大屏整合
将上述所有图表整合到一个可视化大屏中,方便进行综合分析。
from math import pi
# 创建大屏布局
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from math import pi
from matplotlib.gridspec import GridSpec
# 设置全局样式
plt.style.use('dark_background')
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
sns.set(style="darkgrid", palette="muted", font="SimHei")
# 读取数据
df = pd.read_csv("data (1).csv")
# 创建大屏布局
fig = plt.figure(figsize=(24, 16), facecolor='#0d0d0d')
fig.suptitle('机器故障多维度分析大屏', fontsize=28, color='white', fontweight='bold', y=0.98)
# 使用GridSpec创建复杂布局
gs = GridSpec(3, 4, figure=fig, hspace=0.4, wspace=0.3)
# 1. 环境因素与机器故障的关系(柱状图) - 左上
ax1 = fig.add_subplot(gs[0, 0])
sns.barplot(x=df.columns[1:-1], y=df[df['fail'] == 1].sum().tolist()[1:-1],
color='#ff7f50', label="故障次数", ax=ax1)
sns.barplot(x=df.columns[1:-1], y=df[df['fail'] == 0].sum().tolist()[1:-1],
color='#1e90ff', label="正常次数", alpha=0.7, ax=ax1)
ax1.set_title("环境因素与机器故障的关系", fontsize=16, color='white')
ax1.set_xlabel("环境因素", fontsize=12, color='white')
ax1.set_ylabel("次数", fontsize=12, color='white')
ax1.tick_params(axis='x', rotation=45, colors='white')
ax1.tick_params(axis='y', colors='white')
ax1.legend()
ax1.set_facecolor('#1a1a1a')
# 2. 空气质量与机器故障的关系饼状图 - 右上
ax2 = fig.add_subplot(gs[0, 1])
normal_data = df[df['fail'] == 0]
fault_data = df[df['fail'] == 1]
normal_aq_counts = normal_data['AQ'].value_counts().sort_index()
fault_aq_counts = fault_data['AQ'].value_counts().sort_index()
# 左侧饼图 - 正常状态
ax2_1 = fig.add_subplot(gs[0, 1])
ax2_1.pie(normal_aq_counts, labels=normal_aq_counts.index, autopct='%1.1f%%',
startangle=90, colors=['#1e90ff', '#32cd32', '#ffd700'])
ax2_1.set_title('正常状态(fail=0)下的AQ分布', fontsize=14, color='white')
# 右侧饼图 - 故障状态
ax2_2 = fig.add_subplot(gs[0, 2])
ax2_2.pie(fault_aq_counts, labels=fault_aq_counts.index, autopct='%1.1f%%',
startangle=90, colors=['#ff7f50', '#ff4500', '#8b0000'])
ax2_2.set_title('故障状态(fail=1)下的AQ分布', fontsize=14, color='white')
# 3. 机器运行温度与故障的关系(折线图) - 中左
ax3 = fig.add_subplot(gs[1, 0])
sns.lineplot(x='Temperature', y='fail', data=df, marker='o', color='#ff4500', linewidth=2.5, ax=ax3)
ax3.fill_between(df['Temperature'], df['fail'], color='#ff4500', alpha=0.2)
ax3.set_title("机器运行温度与故障的关系", fontsize=16, color='white')
ax3.set_xlabel("运行温度", fontsize=12, color='white')
ax3.set_ylabel("故障状态", fontsize=12, color='white')
ax3.tick_params(axis='both', colors='white')
ax3.grid(True, linestyle='--', alpha=0.3)
ax3.set_facecolor('#1a1a1a')
# 4. 机器电流使用情况与故障的关系(箱线图) - 中右
ax4 = fig.add_subplot(gs[1, 1])
sns.boxplot(x='fail', y='CS', data=df, palette=['#1e90ff', '#ff4500'], ax=ax4)
ax4.set_title("机器电流使用情况与故障的关系", fontsize=16, color='white')
ax4.set_xlabel("状态", fontsize=12, color='white')
ax4.set_ylabel("电流使用情况", fontsize=12, color='white')
ax4.set_xticklabels(["正常", "故障"], color='white')
ax4.tick_params(axis='y', colors='white')
ax4.set_facecolor('#1a1a1a')
# 5. 机器输入压力与故障的关系(热力图) - 左下
ax5 = fig.add_subplot(gs[2, 0])
corr = df[['IP', 'fail']].corr()
sns.heatmap(corr, annot=True, cmap='coolwarm', linewidths=.5, fmt=".2f",
annot_kws={"color": "white", "fontsize": 12}, ax=ax5)
ax5.set_title("机器输入压力与故障的关系", fontsize=16, color='white')
ax5.set_facecolor('#1a1a1a')
# 6. 机器旋转位置与故障的关系(雷达图) - 中下
ax6 = fig.add_subplot(gs[2, 1], polar=True)
categories = df.columns[1:-1].tolist()
N = len(categories)
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1]
normal = df[df['fail'] == 0][categories].mean().tolist()
normal += normal[:1]
fault = df[df['fail'] == 1][categories].mean().tolist()
fault += fault[:1]
ax6.plot(angles, normal, color='#1e90ff', linewidth=2, label='正常')
ax6.fill(angles, normal, color='#1e90ff', alpha=0.25)
ax6.plot(angles, fault, color='#ff4500', linewidth=2, label='故障')
ax6.fill(angles, fault, color='#ff4500', alpha=0.25)
ax6.set_thetagrids(np.degrees(angles[:-1]), categories, color='white')
ax6.set_title("机器旋转位置与故障的关系", fontsize=16, color='white', pad=20)
ax6.legend(loc='upper right', bbox_to_anchor=(1.3, 1.1), facecolor='#1a1a1a', edgecolor='none')
ax6.set_facecolor('#1a1a1a')
# 7. 挥发性有机化合物水平与故障的关系(饼图) - 右下
ax7 = fig.add_subplot(gs[1, 2])
voc_groups = df.groupby('VOC')['fail'].mean().reset_index()
ax7.pie(voc_groups['fail'], labels=voc_groups['VOC'].astype(str),
autopct='%1.1f%%', startangle=90, colors=['#1e90ff', '#32cd32', '#ffd700', '#ff7f50'],
shadow=True)
ax7.set_title('挥发性有机化合物水平与故障关系', fontsize=16, color='white')
ax7.set_facecolor('#1a1a1a')
# 8. 超声波传感器数据与故障的关系(面积图) - 下右
ax8 = fig.add_subplot(gs[2, 2])
ax8.fill_between(df.index[-100:], df['USS'][-100:], alpha=0.5, color='#1e90ff', label='超声波传感器数据')
ax8.fill_between(df.index[-100:], df['fail'][-100:], alpha=0.7, color='#ff4500', label='机器故障')
ax8.set_title("超声波传感器数据与故障的关系", fontsize=16, color='white')
ax8.set_xlabel("时间", fontsize=12, color='white')
ax8.set_ylabel("值", fontsize=12, color='white')
ax8.legend(facecolor='#1a1a1a', edgecolor='none')
ax8.set_facecolor('#1a1a1a')
ax8.tick_params(axis='both', colors='white')
# 添加信息面板
info_ax = fig.add_subplot(gs[0, 3])
info_ax.axis('off')
# 计算关键指标
total_records = len(df)
fault_records = df['fail'].sum()
fault_rate = fault_records / total_records * 100
top_factors = df.columns[1:-1][df[df['fail'] == 1].sum().tolist()[1:-1].index(
max(df[df['fail'] == 1].sum().tolist()[1:-1]))]
# 添加信息文本
info_text = f"""
关键指标分析
------------------------
总记录数: {total_records}
故障记录数: {fault_records}
故障率: {fault_rate:.2f}%
主要故障因素: {top_factors}
故障分布
------------------------
温度 > 80: {len(df[(df['Temperature'] > 80) & (df['fail'] == 1)])}
电流 > 80: {len(df[(df['CS'] > 80) & (df['fail'] == 1)])}
压力 > 80: {len(df[(df['IP'] > 80) & (df['fail'] == 1)])}
建议措施
------------------------
1. 监控温度异常区域
2. 优化电流使用模式
3. 定期检查压力系统
4. 改善空气质量
"""
info_ax.text(0.05, 0.95, info_text, fontsize=14, color='white',
verticalalignment='top', linespacing=1.8)
# 添加公司Logo(这里用文本代替)
fig.text(0.95, 0.95, "工业智能监控系统", fontsize=18, color='white',
ha='right', va='top', alpha=0.7)
# 添加时间戳
fig.text(0.05, 0.01, f"报告生成时间: 2025-06-15 14:30", fontsize=12, color='gray')
# 保存大屏图像
plt.savefig('machine_failure_dashboard.png', dpi=300, bbox_inches='tight')
plt.show()
五、分析总结
通过上述多种图表的可视化分析,我们可以从多个维度深入了解环境因素对机器性能的影响:
- 柱状图:展示了不同环境因素与机器故障之间的关系,可以直观地看出哪些因素与机器故障的关联性较强。
- 散点图:展示了空气质量与机器故障之间的关系,可以直观地看出空气质量对机器故障的影响。
- 折线图:展示了机器运行温度与故障之间的关系,可以直观地看出运行温度对机器故障的影响。
- 箱线图:展示了机器电流使用情况与故障之间的关系,可以直观地看出电流使用情况对机器故障的影响。
- 热力图:展示了机器输入压力与故障之间的关系,可以直观地看出输入压力对机器故障的影响。
- 雷达图:展示了机器旋转位置与故障之间的关系,可以直观地看出旋转位置对机器故障的影响。
- 饼图:展示了挥发性有机化合物水平与故障之间的关系,可以直观地看出挥发性有机化合物水平对机器故障的影响。
- 面积图:展示了超声波传感器数据与故障之间的关系,可以直观地看出超声波传感器数据对机器故障的影响。
通过这些图表的可视化,我们可以更全面地了解环境因素对机器性能的影响,为机器的维护和优化提供有力的数据支持。