0

0

怎么使用Plotly创建交互式异常检测图表?

爱谁谁

爱谁谁

发布时间:2025-07-25 16:19:01

|

933人浏览过

|

来源于php中文网

原创

plotly是异常检测可视化的理想选择,原因有三:1.它提供卓越的交互性,支持缩放、平移和悬停提示,便于深入探索异常细节;2.具备多层级叠加能力,可在同一图表中展示原始数据、阈值线及其他关联变量,帮助理解上下文;3.生成基于web的图表,便于嵌入应用或分享,提升协作效率。此外,plotly支持灵活标记不同类型的异常,通过颜色、形状、大小区分高值、低值异常甚至集体异常,增强可视化表达。结合交互功能,还可实现悬停信息扩展、时间范围聚焦和联动分析,使图表成为动态分析平台,助力深入挖掘异常背后的原因。

怎么使用Plotly创建交互式异常检测图表?

Plotly在创建交互式异常检测图表方面表现出色,它不仅仅是把数据画出来,更提供了一个探索和理解异常的动态画布。核心在于,它能让你直观地看到数据中的“不寻常”,并能深入挖掘这些点背后的细节,而不仅仅是静态地呈现结果。

怎么使用Plotly创建交互式异常检测图表?

解决方案

要使用Plotly创建交互式异常检测图表,我们通常会遵循几个步骤:首先,你需要有时间序列数据,并且通过某种算法(比如简单的统计阈值、Isolation Forest或Prophet等)识别出潜在的异常点。然后,利用Plotly的强大功能将这些数据和异常点以清晰、可交互的方式呈现出来。

一个基本的思路是:将原始时间序列数据作为一条主线图绘制,然后将检测到的异常点作为单独的散点图层叠加其上,并用不同的颜色或标记突出显示。Plotly的plotly.graph_objectsplotly.express都能很好地完成这项任务。

怎么使用Plotly创建交互式异常检测图表?

下面是一个简单的Python示例,演示如何用Plotly创建一个基本的交互式异常检测图表:

import pandas as pd
import numpy as np
import plotly.graph_objects as go
from plotly.subplots import make_subplots

# 1. 生成模拟数据
np.random.seed(42)
dates = pd.date_range(start='2023-01-01', periods=100, freq='H')
data = np.random.normal(loc=100, scale=5, size=100)
# 注入一些异常
data[20:25] += 20  # 连续高值异常
data[60] -= 30    # 单点低值异常
data[80:83] += np.array([15, -20, 25]) # 混合异常

df = pd.DataFrame({'timestamp': dates, 'value': data})

# 2. 简单的异常检测(基于统计阈值)
# 这里我们用一个简单的规则:值超出平均值±2.5个标准差的,认为是异常
mean_val = df['value'].mean()
std_val = df['value'].std()
threshold_upper = mean_val + 2.5 * std_val
threshold_lower = mean_val - 2.5 * std_val

df['is_anomaly'] = ((df['value'] > threshold_upper) | (df['value'] < threshold_lower))
anomalies = df[df['is_anomaly']]

# 3. 使用Plotly创建交互式图表
fig = go.Figure()

# 添加原始数据线
fig.add_trace(go.Scatter(
    x=df['timestamp'],
    y=df['value'],
    mode='lines',
    name='原始数据',
    line=dict(color='lightgray'),
    hoverinfo='x+y'
))

# 添加异常点
fig.add_trace(go.Scatter(
    x=anomalies['timestamp'],
    y=anomalies['value'],
    mode='markers',
    name='检测到的异常',
    marker=dict(color='red', size=8, symbol='circle'),
    hoverinfo='x+y+name', # 悬停时显示更多信息
    marker_line_width=1,
    marker_line_color='darkred'
))

# 添加阈值线(可选,但通常很有用)
fig.add_trace(go.Scatter(
    x=df['timestamp'],
    y=[threshold_upper]*len(df),
    mode='lines',
    name='上限阈值',
    line=dict(color='blue', dash='dash'),
    hoverinfo='name'
))
fig.add_trace(go.Scatter(
    x=df['timestamp'],
    y=[threshold_lower]*len(df),
    mode='lines',
    name='下限阈值',
    line=dict(color='blue', dash='dash'),
    hoverinfo='name'
))

# 更新布局,使其更具交互性
fig.update_layout(
    title_text='时间序列异常检测',
    xaxis_title='时间',
    yaxis_title='数值',
    hovermode='x unified', # 统一X轴的悬停信息
    template='plotly_white', # 使用白色背景模板
    xaxis_rangeslider_visible=True # 添加时间范围滑动条
)

# fig.show() # 在Jupyter Notebook或浏览器中显示图表

这段代码展示了如何加载数据、进行简单的异常识别,然后用go.Scatter分层绘制正常数据和异常点,并添加了阈值线和交互式元素,比如悬停提示和时间范围滑动条。

怎么使用Plotly创建交互式异常检测图表?

为什么Plotly是异常检测可视化的理想选择?

对我来说,Plotly在异常检测可视化方面简直是量身定制。它最吸引人的地方在于其卓越的交互性。当你在处理异常数据时,你不仅仅想“看到”一个点是异常,你更想“探索”它。Plotly的缩放、平移、以及那个好用的悬停提示(hover tooltip)功能,让你可以轻松地放大到某个异常事件,查看精确的时间戳和数值,甚至可以自定义显示更多相关信息,比如异常分数或者其他特征。

我发现,在实际工作中,很多时候一个“异常”并不是孤立存在的,它可能与前后数据、或者其他相关指标有微妙的联系。Plotly允许你在同一个图表中叠加多条轨迹(比如原始数据、预测值、上下限阈值、甚至其他关联变量),这样就能在一个统一的视图中进行多维度分析。比如,你可以把温度和机器的运行状态画在一起,当温度异常升高时,立刻就能看到机器是否也随之出现了性能下降。这种多层级的可视化能力,对于理解异常的上下文和潜在原因至关重要。

DeepL
DeepL

DeepL是一款强大的在线AI翻译工具,可以翻译31种不同语言的文本,并可以处理PDF、Word、PowerPoint等文档文件

下载

另外,Plotly生成的图表是基于Web的,这意味着它们可以非常方便地嵌入到Web应用、Dashboards或者直接导出为HTML文件分享。这对于团队协作和结果汇报来说,效率极高。你不再需要截取一堆静态图片,而是可以直接分享一个活生生的、可供他人自行探索的图表,这大大提升了沟通的效率和深度。有时候,我甚至会觉得,Plotly不仅仅是一个绘图工具,它更像是一个数据侦探的“放大镜”和“实验室”,让数据分析师能更深入地剖析数据的每一个细节。

如何在Plotly中标记和突出显示不同类型的异常?

在异常检测中,异常的类型多种多样:有单一的离群点(point anomalies),有上下文相关的异常(contextual anomalies,比如某个值在平时正常,但在特定时间段就异常了),还有集体异常(collective anomalies,一系列点组合起来才异常)。在Plotly中,我们可以灵活地标记和突出显示这些不同类型的异常,以提供更丰富的视觉信息。

一个直接的方法是为不同类型的异常使用不同的颜色、形状或大小。例如,你可以将“高值异常”标记为红色三角形,将“低值异常”标记为蓝色倒三角形。如果你的异常检测算法能输出异常的“严重程度”或“分数”,你甚至可以根据这个分数来动态调整异常点的大小或颜色的深浅,分数越高,点越大或颜色越深。

实现上,你可以创建多个go.Scatter轨迹,每个轨迹专门用于显示一种特定类型的异常。比如,你可以先筛选出所有高值异常,作为第一个go.Scatter轨迹;再筛选出所有低值异常,作为第二个go.Scatter轨迹。

# 假设我们已经识别出高值异常和低值异常
high_anomalies = df[(df['value'] > threshold_upper)]
low_anomalies = df[(df['value'] < threshold_lower)]

fig_types = go.Figure()

fig_types.add_trace(go.Scatter(
    x=df['timestamp'],
    y=df['value'],
    mode='lines',
    name='原始数据',
    line=dict(color='lightgray')
))

fig_types.add_trace(go.Scatter(
    x=high_anomalies['timestamp'],
    y=high_anomalies['value'],
    mode='markers',
    name='高值异常',
    marker=dict(color='red', size=10, symbol='triangle-up'),
    hoverinfo='x+y+name'
))

fig_types.add_trace(go.Scatter(
    x=low_anomalies['timestamp'],
    y=low_anomalies['value'],
    mode='markers',
    name='低值异常',
    marker=dict(color='blue', size=10, symbol='triangle-down'),
    hoverinfo='x+y+name'
))

fig_types.update_layout(title_text='不同类型异常的标记', xaxis_title='时间', yaxis_title='数值')
# fig_types.show()

此外,对于集体异常,你可以考虑使用go.Scatterfill属性来填充异常发生的时间段,或者使用go.Shape来绘制矩形区域,明确指出异常发生的时间范围。通过结合这些视觉元素,你可以为观察者提供一个更直观、更细致的异常概览。当然,这也不是没有挑战的,比如数据量一大,前端渲染就得考虑性能了,但Plotly在优化这方面做得还不错。

结合交互式图表,如何进一步分析异常数据?

仅仅“看到”异常是不够的,真正的价值在于“分析”和“理解”这些异常。Plotly的交互性为进一步的异常分析提供了强大的平台。我通常会利用以下几个方面来深入挖掘:

  1. 细致的悬停信息 (Hover Info Drill-down): 这是最基础也最实用的功能。当鼠标悬停在异常点上时,除了显示时间戳和数值,你还可以自定义hover_data来显示更多上下文信息,比如:

    • 异常分数 (Anomaly Score)
    • 与该异常相关的其他特征值(例如,如果是在监控服务器CPU使用率,可以同时显示内存、网络I/O等)
    • 异常的类别或标签(如果是多分类异常)
    • 来自日志或数据库的简短描述或ID。 这就像是给每个异常点都附上了一张“名片”,让我在不离开图表的情况下就能获取初步的诊断信息。
  2. 时间范围探索 (Time Range Exploration): Plotly的xaxis_rangeslider_visible=True和图表上方的范围选择器(range selector buttons,如“1m”, “YTD”等)功能,让你可以快速地聚焦到某个异常发生的时间段。当你看到一个大范围的异常趋势时,可以迅速放大到具体的几个小时甚至几分钟,去观察微小的波动和细节,这对于识别异常的精确起始点和结束点,以及其内部的结构非常关键。我发现很多时候,一个大的异常事件实际上是由一系列小的、快速变化的子事件构成的,只有放大才能看清。

  3. 联动分析 (Linked Views/Dash): 虽然Plotly本身是静态的HTML输出,但当它与Dash这样的框架结合时,其潜力会被彻底释放。你可以构建一个仪表板,其中一个Plotly图表显示异常,当你在图表上选择一个异常点或区域时,可以触发其他组件的更新,比如:

    • 在另一个表格中显示该异常点对应的原始数据行。
    • 在另一个Plotly图表中显示与该异常相关的其他指标的时间序列图。
    • 自动查询后端数据库,获取该异常事件的详细日志。 这种联动性让分析流程变得非常流畅,从“发现异常”到“深入诊断”的路径变得几乎无缝。这对于进行根因分析、评估异常影响范围等高级分析任务来说,简直是生产力倍增器。

通过这些交互式功能,异常检测图表不再仅仅是报告结果的工具,它更成为了一个动态的分析平台,帮助我们从数据中讲述异常的故事,并最终推动问题的解决。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

753

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

636

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

758

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1262

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

707

2023.08.11

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.7万人学习

Django 教程
Django 教程

共28课时 | 3.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号