首页 > 其他分享 >使用主题河流图进行数据可视化

使用主题河流图进行数据可视化

时间:2024-09-29 10:48:17浏览次数:11  
标签:df data 主题 数据表 柱状图 可视化 河流 数据 告警

目录

前言

正文


前言

本文是Web数据可视化案例系列文章的第三篇。文章介绍主题河流图的用法。首先介绍主题河流图与堆叠柱状图的区别,其次详细说明如何使用主题河流图展示数据。

当我们面对一组具有2个维度属性的数据时,如果不使用可视化手段,很难抓到正确的数据趋势。对于这种超过一个维度的数据,我们常常想到使用堆叠柱状图来显示数据。但是堆叠柱状图在使用时是有限制的,比如,一组数据统计了每天9点、10点、11点、12点设备上报告警的数量,使用堆叠柱状图显示这组数据就会割裂每天数据的连贯性趋势,所以最好使用主题河流图(在Excel中,这种类型的图表叫做面积图)显示数据。

正文

那么,主题河流图和堆叠柱状图有什么区别呢?他们的主要区别在于它们所展示的数据类型和目的。‌

‌主题河流图‌主要用于表示事件或主题在一段时间内的变化。它通过不同颜色的条带状河流分支来编码不同的事件或主题,河流分支的宽度编码了原数据集中的value值。此外,原数据集中的时间属性被映射到单个时间轴上,从而形象地展示了一个主题或事件随时间的变化情况。这种图表类型特别适合展示动态的数据变化和事件流程‌。举例如下图。

‌堆叠柱状图‌则主要用于展示一个大分类包含的每个小分类的数据,以及各个小分类的占比。它通过将每个柱子进行分割来显示相同类型下各个数据的大小情况,从而形象地展示了单个项目与整体之间的关系。堆叠柱状图可以清晰地展示各个小分类与大分类之间的数量关系,以及它们在整体中的占比‌。

简而言之,主题河流图更适合用来展示动态的事件或主题随时间的变化情况,而堆叠柱状图则更适合用来展示不同小分类与大分类之间的数量关系和占比情况。

下面我们依然使用轻量级、开源的bottle作为前台web框架,页面使用echarts图表的主题河流图展示数据。在后台,我们使用python编程查询数据,仍然使用sqlite轻量级数据库存储数据。

项目背景是这样的:一台监控主机负责监控网络通信问题导致的告警,告警数量增加时,表明有通信链路产生问题。同时,该类型告警信息可因为通信链路经过多次尝试后变为正常通信,最终导致相关联的告警自动解除,因此告警数量会因此减少。该类型告警数据每天都会重复统计,统计频率是每小时统计一次。当前需求就是,让数据大屏显示该类型告警每天9点、10点、11点、12点告警变化趋势。

首先,我们先看下数据库中存储告警的表结构,以及数据集合的情况。

从数据表名称看,表名是使用日期+时间命名的,数据表中包括很多告警的数量统计信息,我们只显示告警alm001的数据。

根据对现有数据分析,我们需要整理出所有告警alm001的数量,日期和时间。如何从众多数据表中查询出所有alm001的每天每个时刻的告警数量,有没有简单的办法呢?

下面是代码实现:

def getAlm001Data():
    db = create_engine(r'sqlite+pysqlite:///D:\alarmdb.sqlite3')
    sql_cmd = '''select 'select "'||name||'" as tn,alarm_count from '||name||' where  alarm_name="alm001"' from sqlite_master where name like "d05%"'''
    conn = db.connect()
    res = conn.execute(text(sql_cmd))
    obj = res.fetchall()
    res.close()
    sql_query= ' union '.join([str(row[0]) for row in obj])
    df = pd.read_sql(sql=sql_query, con=conn)
    df['d']=df['tn'].apply(lambda x:'2024/'+x[1:3]+'/'+x[3:-2])
    df['h']=df['tn'].apply(lambda x:x[-2:])
    df = df[['d','alarm_count','h']]
    df = df.astype({'alarm_count':'int64'})
    json_lst=df.to_json(orient='values',force_ascii=False).replace('"', "'")
    return json_lst

如果看过本系列前面文章的小伙伴会发现,这里处理多数据表查询相同条件数据的方法,与《使用 svg 图表进行数据可视化》处理多数据表的方法一模一样。此处就略过不讲,如果有不明白的地方请参考上一篇文章。

因为我们还要统计告警的日期和时间信息,这些信息都包含在数据表中,所以我们需要通过数据表名称来获取告警日期和时间信息。

    df['d']=df['tn'].apply(lambda x:'2024/'+x[1:3]+'/'+x[3:-2])
    df['h']=df['tn'].apply(lambda x:x[-2:])

数据列’tn’就来自于数据查询时保留的数据表的名称。

这个方法最后将数据转成json数组对象,每个数组元素也是一个数组,这个数组中有日期,告警数量,时间。

现在有了数据,我们通过bottle框架来搭建前台页面。

在bottle的控制模块增加路由配置用于指定需要显示的可视化页面。我们先把这个模板命名为almview.tpl,我们随后再绘制这个页面。控制模块增加下面的配置:

@route('/almview', method='GET')
def almview():
    data = getAlm001Data()
    return template('view/almview',json_data=data)

到了绘制河流图的最关键的地方,请大家瞪大眼睛仔细听讲啦。

先把almview.tpl的实现代码放在这里,后面讲解。

var chartDom = document.getElementById('main');
var myChart = echarts.init(chartDom);
var data={{!json_data}}
var option;
option = {
  tooltip: {
    trigger: 'axis',
    axisPointer: {
      type: 'line',
      lineStyle: {
        color: 'rgba(0,0,0,0.2)',
        width: 1,
        type: 'solid'
      }
    }
  },
  legend: {
    data: ['09', '10', '11', '12']
  },
  singleAxis: {
    top: 50,
    bottom: 50,
    axisTick: {},
    axisLabel: {},
    type: 'time',
    axisPointer: {
      animation: true,
      label: {
        show: true
      }
    },
    splitLine: {
      show: true,
      lineStyle: {
        type: 'dashed',
        opacity: 0.2
      }
    }
  },
  series: [
    {
      type: 'themeRiver',
      emphasis: {
        itemStyle: {
          shadowBlur: 20,
          shadowColor: 'rgba(0, 0, 0, 0.8)'
        }
      },
      data: data
    }
  ]
};

首先最关键的是要把series类型设置为'themeRiver',说明使用主题河流图。

接着需要设置legend,用来对应告警每个时间点的趋势情况。这个legend的目的是我们可以通过点击legend过滤时间点显示告警趋势。'09', '10', '11', '12'代表时间点,与从数据库查询出来的json数据中的时间点对应。

  legend: {
    data: ['09', '10', '11', '12']
  },

最后,我们要把横坐标轴对应到告警发生的日期。

  singleAxis: {
    top: 50,
    bottom: 50,
    axisTick: {},
    axisLabel: {},
    type: 'time',
    axisPointer: {
      animation: true,
      label: {
        show: true
      }
    },

其中,type: 'time',用来告诉echarts横坐标使用时间类型数据。

大功告成,我们测试一下显示效果。打开浏览器输入http://127.0.0.1:8099/almview,我们就可以看到如下图像了。

如果我们只显示9点告警趋势情况,只需要关闭其他的时间点的legend就可以了。

看到这里,你是否了解了主题河流图与堆叠柱状图的区别,是否知道了怎样使用主题河流图显示数据呢?欢迎与我交流。

标签:df,data,主题,数据表,柱状图,可视化,河流,数据,告警
From: https://blog.csdn.net/hgoop/article/details/142629944

相关文章

  • 【学习笔记】python数据可视化之matplotlib实践第二章
    使用统计函数绘制简单图形1.bar()函数:在x轴上绘制定性数据的分布特征,用于绘制柱状图函数基本参数介绍:plt.bar(x,height,color='c',edgecolor='y',width=0.8,align='center',tick_label=['白菜','卷心菜'],hatch='/')x柱状图的x轴坐标,每个数值对应于一个柱子的......
  • 深色系的可视化大屏随处可见,深色系B端系统不常见,有啥学问?
    一、可视化大屏为什么不宜选择浅色系。可视化大屏通常用于展示数据、图表、图像等信息,而不宜选择浅色系的原因有以下几点:1.对比度不足:浅色系的背景会使文字、图表等内容与背景色对比度降低,降低了信息的可读性和清晰度,尤其在较远距离观看时更为明显。2.易受光线影响:在......
  • R语言非参数回归预测摩托车事故、收入数据:局部回归、核回归、LOESS可视化
    全文链接:https://tecdat.cn/?p=37784原文出处:拓端数据部落公众号 非参数回归为经典(参数)回归方法提供了一种灵活的替代方法。与假定回归关系具有依赖于有限数量的未知参数的已知形式的传统(参数)方法不同,非参数回归模型尝试从数据样本中学习回归关系的形式。1.1动机和目标所......
  • ChatGPT在大气科学领域建模、数据分析、可视化与资源评估的应用
    如何结合最新AI模型与Python技术处理和分析气候数据。使用GPT处理数据、生成论文摘要、文献综述、技术方法分析等案例。特别关注将GPT与Python结合应用于遥感降水数据处理、ERA5大气再分析数据的统计分析、干旱监测及风能和太阳能资源评估等大气科学关键场景。1、掌握AI工具应......
  • Registry私有仓库可视化
    Registry私有仓库可视化一、简介        私有DockerRegistry通常用于企业内部或特定团队中存储和管理Docker镜像。随着项目的发展,镜像数量不断增加,管理起来变得越来越复杂。使用可视化的工具可以帮助管理员和开发者更直观地查看和管理这些镜像,从而提高工作效率......
  • 可视化对话树编辑笔记
    在制作RPG甚至AVG的时候,我们要涉及大量的文本编辑,这个时候不可视化的界面会大大提升项目的维护成本(非常好脚本,使我AVG项目崩溃),所以我们需要自己创建一个文本编辑界面。而在涉及对话的时候,这个叫做对话树的结构具有不错的性质,对话树是一个简单的多叉树结构,但节点被分为CP......
  • PARTVI-Oracle数据库管理与开发-数据库管理员和开发人员的主题
    17.数据库管理员和开发人员的主题17.1.数据库安全概述通常情况下,数据库安全涉及用户认证、加密、访问控制和监控。17.1.1.用户账户每个Oracle数据库都有一个有效数据库用户的列表。数据库包含几个默认账户,包括默认的管理员账户SYSTEM(参见第2-5页的“SYS和SYSTEM模式”)。你可......
  • 2款.NET开源且免费的Git可视化管理工具
    Git是什么?Git是一种分布式版本控制系统,它可以记录文件的修改历史和版本变化,并可以支持多人协同开发。Git最初是由Linux开发者LinusTorvalds创建的,它具有高效、灵活、稳定等优点,如今已成为软件开发领域中最流行的版本控制系统之一。Git使用一种名为“仓库”的数据结构来保存代码......
  • python爬虫广州城市租房需求数据分析系统 可视化大屏分析系统xumld.
    目录项目介绍技术栈具体实现截图Scrapy爬虫框架关键技术和使用的工具环境等的说明解决的思路开发流程爬虫核心代码展示系统设计论文书写大纲详细视频演示源码获取项目介绍租房者模块账户管理:注册、登录、个人信息编辑、密码更改、账户注销。房源浏览:查看不同类型......
  • 山海鲸可视化 VS PowerBI,中外免费报表软件对比
    在数据分析与可视化的时代,选择合适的报表工具显得尤为重要。山海鲸可视化和PowerBI是市场上颇受欢迎的两款免费报表软件,各有特色。接下来,我们将从功能、优缺点等方面进行对比,帮助你找到最适合的工具。山海鲸可视化山海鲸可视化是一款国内自主研发的报表工具,专注于用户体验和简易......