数据可视化--实验五:高维非空间数据可视化

2023-05-16

声明:本文CSDN作者原创投稿文章,未经许可禁止任何形式的转载,原文链接

文章目录

    • 概要
    • 实验过程
      • Pyecharts
      • 实验结果
      • 平行坐标系
      • room1-6房间人员时长饼图

概要

  • 学院:计算机科学与技术学院
  • 实验日期:2020-10-15
  • 实验目的: 掌握高维非空间数据可视化
  • 实验内容:
    • 在某次大型会议中,为确保会议过程安全,会场使用了电子胸牌对场内人员的移动轨迹进行了监控。现经过处理,得到了某一天内人员在场内各个区域逗留的时间统计数据(time_allocate_day1.csv)。请根据这份数据,完成以下任务:
      • 1、设计可视化方案,要求通过该方案可以实现对人员的分类(分类结果已给出,仅绘制出图像即可)
      • 2、请根据上述图像,分析会场中room1~6的功能。
  • 注:表格文件在我的资源中免费下载。名为“数据可视化实验–表格附件”。链接
  • 因为即使我设置了不要积分,CSDN还是不让免费下载,可以请直接到GitHub下载:GitHub链接

实验过程

本次实验选择编程类工具Pyecharts

Pyecharts

​ 在Pycharm中新建python项目,并引入pyecharts,openpyxl,datetime等必要包。

创建main.py,写入以下内容。

#!/usr/bin/env python
# coding:utf-8
"""
Name    : main.py
Author  : F
Time    : 2020/10/15 20:09
Desc    : 数据可视化实验五
"""
import openpyxl
from pyecharts.charts import HeatMap, Parallel
import pyecharts.globals as globals
from pyecharts import options as opts
from pyecharts.charts import Pie

globals._WarningControl.ShowWarning = False  # 关闭pyecharts给出的警告


def getClassifyData():
    filename = "classifyday1.xlsx"
    ws = openpyxl.load_workbook(filename)['classifyday1']
    classifyData = []
    for i in range(2, ws.max_row + 1):
        row = str(i)
        classifyData.append([ws['A' + row].value, ws['B' + row].value])
    return classifyData


# 从表格读取数据
def getRoomData():
    filename = "time_allocate_day1.xlsx"
    ws = openpyxl.load_workbook(filename)['time_allocate_day1']
    roomData, roomName = [], []
    for room in range(24):
        roomName.append(
            opts.ParallelAxisOpts(dim=room, name=ws[chr(room + 65) + '1'].value, min_='dataMin', max_='dataMax'))
    for i in range(2, ws.max_row + 1):
        row, person = str(i), []
        for room in range(24):
            person.append(ws[chr(room + 65) + row].value)
        roomData.append(person)
    return roomData, roomName


# 不同人员平行坐标系图
def drawRoomDataParallel():
    roomData, roomName = getRoomData()
    c = (
        Parallel(init_opts=opts.InitOpts(width="2000px", height="1000px")).add_schema(
            roomName).add(series_name="人员分类图",
                          data=roomData,
                          linestyle_opts=opts.LineStyleOpts(color={'type': 'linear', 'x': 0,
                                                                   'y': 0,
                                                                   'x2': 0,
                                                                   'y2': 1,
                                                                   'colorStops': [{
                                                                       'offset': 0, 'color': 'red'
                                                                   }, {
                                                                       'offset': 1,
                                                                       'color': 'blue'
                                                                   }],
                                                                   'global': False
                                                                   }, opacity=0.5)
                          ).set_global_opts(title_opts=opts.TitleOpts(title="数据可视化实验五"))
    )
    c.render("不同人员平行坐标系图.html")


def genHeatBaseData():
    x, y = [], []
    for i in range(100):
        fmt = str("{:0>2d}".format(i))
        x.append(fmt)
        y.append('1' + fmt)
    return x, y


def classifyHeatMap(xAxisData: list, yAxisData: list, data: list):
    HeatMap(init_opts=opts.InitOpts(width="2000px", height="2000px")).add_xaxis(xaxis_data=xAxisData).add_yaxis(
        series_name="classifyHeatMap",
        yaxis_data=yAxisData,
        value=data,
        label_opts=opts.LabelOpts(
            is_show=False, color="#fff", position="bottom", horizontal_align="50%"
        ),
    ).set_series_opts().set_global_opts(
        legend_opts=opts.LegendOpts(is_show=True),
        xaxis_opts=opts.AxisOpts(
            type_="category",
            splitarea_opts=opts.SplitAreaOpts(
                is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
            ),
            axislabel_opts=opts.LabelOpts(
                interval=0
            )
        ),
        yaxis_opts=opts.AxisOpts(
            type_="category",
            splitarea_opts=opts.SplitAreaOpts(
                is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
            ),
        ),
        visualmap_opts=opts.VisualMapOpts(
            orient="horizontal", pos_left="center", is_piecewise=True,
            pieces=[
                {"value": 2, "label": 'waiter'},
                {"value": 4, "label": 'vip'},
                {"value": 6, "label": 'participant'},
                {"value": 8, "label": 'meeting'},
                {"value": 10, "label": 'reporter'},
            ]
        ),
    ).render("classifyHeatMap.html")


def serializeClassifyData(data: list):
    job = {'waiter': 2, 'vip': 4, 'participant': 6, 'meeting': 8, 'reporter': 10}
    sData = {}
    for person in data:
        if not sData.__contains__(str(person[0])[0:3]):
            sData[str(person[0])[0:3]] = {}
        sData[str(person[0])[0:3]][str(person[0])[3:5]] = job[person[1]]
    return sData


def genClassifyHeatMapData(data: dict):
    rdata = []  # data中的每个列表内容依次是横坐标 纵坐标 值
    for k, v in data.items():
        for sk, sv in v.items():
            rdata.append([int(sk), int(k) - 100, sv])
    return rdata


def drawClassifyHeatMap():
    classifyData = getClassifyData()
    serializedClassifyData = serializeClassifyData(classifyData)
    xAxisValue, yAxisValue = genHeatBaseData()
    classifyHeatMapData = genClassifyHeatMapData(serializedClassifyData)
    classifyHeatMap(xAxisValue, yAxisValue, classifyHeatMapData)


# 计算每种人去了每个房间的总和
def getRoomData1():
    classifyData = getClassifyData()
    serializedClassifyData = serializeClassifyData(classifyData)
    filename = "time_allocate_day1.xlsx"
    ws = openpyxl.load_workbook(filename)['time_allocate_day1']
    roomData = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
    for i in range(2, ws.max_row + 1):
        row = str(i)
        for room in range(6):
            roomData[((serializedClassifyData[str(ws['A' + row].value)[0:3]][
                str(ws['A' + row].value)[3:5]]) // 2) - 1][room] += ws[chr(103 + room) + row].value
    # roomData=[[0, 0, 0, 0, 60831, 234033], [89477, 1235993, 30267, 0, 60746, 0], [78857, 0, 30304, 0, 3632303, 0],
    # [633270, 0, 410705, 0, 0, 0], [3233, 1550, 2401, 119402, 0, 0]]
    return roomData


# 计算每个房间都被多少人呆过的总和
def getRoomData2(roomData: list):
    roomData2 = [[], [], [], [], [], []]
    for i in roomData:
        k = 0
        for v in i:
            roomData2[k].append(v)
            k += 1
    # roomData2=[[0, 89477, 78857, 633270, 3233], [0, 1235993, 0, 0, 1550], [0, 30267, 30304, 410705, 2401],[0, 0, 0,
    # 0, 119402], [60831, 60746, 3632303, 0, 0], [234033, 0, 0, 0, 0]]
    return roomData2


def drawRoomData2Pie():
    roomData2 = getRoomData2(getRoomData1())
    jobs = ['waiter', 'vip', 'participant', 'meeting', 'reporter']
    newData = [[], [], [], [], [], []]
    k = 0
    for room in roomData2:
        i = 0
        for job in room:
            newData[k].append([jobs[i], job])
            i += 1
        k += 1
    k = 0
    pieCenter = [["20%", "30%"], ["55%", "30%"], ["85%", "30%"], ["20%", "70%"], ["55%", "70%"], ["85%", "70%"]]
    pie = Pie()
    for data in newData:
        pie.add("Room" + str(k + 1), data, center=pieCenter[k], radius=[40, 70])
        k += 1
    pie.set_global_opts(
        title_opts=opts.TitleOpts(title="Room1-6各人员访问量"),
        legend_opts=opts.LegendOpts(is_show=False),
    ).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}", is_show=True))
    pie.render("roomTime.html")


if __name__ == '__main__':
    # drawClassifyHeatMap() # 热力图是在已知人员分类的情况下画出来的,但是第一问的前提是不知道人员分类
    # 用平行坐标系画图
    drawRoomDataParallel()
    # 1:休息区 2:嘉宾休息区 3:休息区 4:记者区 5:黑客竞赛现场 6:工作人员休息区
    drawRoomData2Pie()

代码流程:

  • 读取Excel文件time_allocate_day1.xlsx
  • 拿到数据中每个id对应的职位。
  • 因为id为5位,前三位范围为100-199,后两位范围为0-99,所以以前三位为纵轴,后三位为横轴,画出个人职位热力图,热力图中不同颜色代表着不同职位。
  • 画出热力图,即可通过该热力图可以实现对人员的分类。任务一“设计可视化方案,要求通过该方案可以实现对人员的分类(分类结果已给出,仅绘制出图像即可)”完成。
  • 任务一“设计可视化方案,要求通过该方案可以实现对人员的分类(分类结果已给出,仅绘制出图像即可)”要求在不知道人员分类的前提下实现对人员的分类,所以上述热力图方案不可使用,因为数据有24维,故选择绘制平行坐标系。
  • 画出平行坐标系,即可通过该热力图可以实现对人员的分类。任务一“设计可视化方案,要求通过该方案可以实现对人员的分类(分类结果已给出,仅绘制出图像即可)”完成
  • 读取Excel文件time_allocate_day1.xlsx和classifyday1.xlsx
  • 拿到每个房间不同人员所处的时长总和。
  • 画出每个房间不同人员所处时长的饼图。
  • 观察图像,得出结论。

实验结果

平行坐标系

人员分类平行坐标系如下所示,可以通过此图观察分辨某人职位

在这里插入图片描述

room1-6房间人员时长饼图

在这里插入图片描述

上图从左到右从上到下依次是Room1-6的房间人员访问量。

对上图进行分析:

  • Room1和Room3被访问最多的是meeting,所以认为这两个房间是休息区
  • Room2绝大多是被vip访问,所以可以认为Room2是嘉宾休息区
  • Room4绝大多是reporter访问,所以可以认为Room4是记者区
  • Room5绝大多是participant访问,所以可以认为Room5是黑客竞赛现场
  • Room6绝大多是waiter访问,所以可以认为Room6是工作人员休息区

所以结论为:Room1:休息区 Room2:嘉宾休息区 Room3:休息区 Room4:记者区 Room5:黑客竞赛现场 Room6:工作人员休息区

数据可视化–实验五:高维非空间数据可视化实验完成,两项实验结果均符合要求,实验成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据可视化--实验五:高维非空间数据可视化 的相关文章

  • vscode调试webpack-dev-server项目

    先上结果 vscode下载debugger for chrome 插件 创建launch json 添加的时候选择Chrome Launch会自动生成chrome调试模板 xff0c 主要是要加上 34 preLaunchTask 34 3
  • OpenNetworkLinux:i2c-gpio.c源码学习笔记

    OpenNetworkLinux xff1a i2c gpio c源码学习笔记 i2c gpio的init和exit i2c驱动需要首先在平台驱动上进行注册 xff0c 方可提供自身的总线供适配器进行注册 xff0c 注册流程类似于一个内核
  • 每天一个Lodash源码解析

    每天一个Lodash源码解析 chunk 方法介绍自我实现源码分析代码对比知识点补充浮点数转化为浮点数数组创建方法区别js中切割数组方法 slice 方法介绍自我实现源码分析代码对比知识点补充 96 96 gt gt gt 96 96 移位
  • conda的常用操作

    1 查看conda版本 2 更改安装第三方库的源 将国外的源改为清华镜像源 cmd窗口依次输入 xff1a conda config add channels https mirrors tuna tsinghua edu cn anaco
  • 云技术

    什么是 云 与云技术 xff1f 云技术是在分布式计算技术 网格计算基数基础上发展起来的一种计算技术 云技术基于资源虚拟化的方式 xff0c 为用户提供方便快捷的服务 xff0c 可以实现计算与存储的分布式与并行处理 云技术为其他信息技术
  • 什么是上转型对象及其基本特征

    5 12 什么是上转型对象及其基本特征 xff1f 上转型对象 子类对象赋值给父类变量 例如 xff1a package com wangxing test1 父类 public class Person public void testP
  • 【树莓派入门系列】4 树莓派安装测试torch与torchvision

    树莓派运行YOLOV5项目 安装测试torch amp torchvision 项目目录 点击跳转 0 首页 1 前期准备工作 2 配置树莓派系统 3 安装测试opencv 4 安装测试torch amp torchvision 5 测试y
  • javascript中in和includes的区别

    in的用法 遍历对象 span class token keyword let span names span class token operator 61 span span class token punctuation span n
  • centos安装java环境

    方式一 xff1a 安装java环境 1 先查看本地是否自带java环境 xff1a yum list installed grep java 2 卸载自带的java xff08 输入su xff0c 输入root超级管理员的密码 xff0
  • 计算机网络(五) 网络层(中)

    网络层 xff08 中 xff09 3 划分子网和构造超网3 1划分子网3 2使用子网时分组的转发3 3无分类编址CIDR xff08 构造超网 xff09 4 网际控制报文协议 xff08 ICMP xff09 4 1 ICMP报文的种类
  • 【软件工程学习】软件工程概论

    一 软件工程基础 软件是什么 xff1f xff08 1 xff09 软件独立于硬件 早期软件是作为计算机硬件的零件来开发的 xff0c 40年代中后期和50年代早期时 xff0c 为了利用计算机硬件进行研究 xff0c 使用针对专门的硬件
  • Hadoop (四) ——MapReduce 的原理+实现

    MapReduce简介 MapReduce是一种编程模型 xff0c 用于大规模数据集的并行运算 概念 34 Map xff08 映射 xff09 和 34 Reduce xff08 归约 xff09 xff0c 是它们的主要思想 xff0
  • 51单片机oled12864显示时间日期温度

    思路 xff1a 电源接入 第一行显示时间 第二行显示日期 xff0c 屏幕下面左边显示星期 xff0c 右边显示温度 xff0c 当k1按键第一次按下进入设置页面 xff0c 在设置页面 xff0c k1按键为确定 k2按键为循环选择 k
  • python post请求报错:{“error“:“invalid_request“,“error_description“:“Missing grant type“}

    request post请求报错信息 xff1a error invalid request error description Missing grant type 修改为 xff1a 把headers中的 Content Type 改为
  • Ubuntu下teamviewer的安装及使用

    1 到官网下载对应的安装包 xff0c 官网下载网址 xff1a https www teamviewer cn cn download linux coupon 61 CMP SEM CN 20 amp utm source 61 bai
  • 海南大学考研人,你真的马上就要上岸了

    临考前 xff0c 很多注意事项大家要提前了解 最近很多同学问到试卷拆封的问题 xff0c 今天 我们海大学长学姐们 就给大家详细地说一下考研试卷拆封的整个过程 考研并不是传统的发卷子 xff0c 而是 发信封 自己开封 xff0c 答题
  • (windows+xrdp+ubuntu16.04)远程服务器出错:“password failed error - problem connecting“

    这个问题貌似是2019年1月10日xrdp进行了系统自动更新后导致的 xff0c 有两个解决办法 xff1a 方法1 xff1a 对xrdp进行降级重新安装sudo apt get install xrdp 61 0 6 1 2 方法2 x
  • C# SharpGL-Material材质

    在上一节C SharpGL Light光源讲了我们身边的几个实际场景与OpenGL一些参数对应关系 xff0c 其中讲到了反射光的颜色 xff1a 4 反射的光颜色 xff1a 我们之所以能够看到不发光的物体 xff0c 是因为这些不发光的
  • 海南大学考研经验分享之(考研数学)

    提问 xff1a 2022考研数学会不会是史上最难的一年 答 xff1a 考研就是考数学 这句话对于考试科目中有数学的同学们来说 xff0c 是有一定道理的 每一年都是史上最难 xff0c 不管是不是史上最难的 xff0c 只要认真备考 x
  • 23年海南大学835上岸考研资料(历年真题)及笔记(耗时1年)

    23年 xff0c 海南大学835软件工程 上岸必备资料 xff08 历年真题 xff09 及笔记 xff08 耗时一年 xff09 xff01 首先挂一下22年考试qun图 xff0c qun里给大家每日分享考研英语和数学 xff0c 专

随机推荐

  • 海南大学信号与系统838考研经验(3)

    4 问 xff1a 信号与系统838复习参考书目是什么 xff1f 海大官网是没有明确的参考书籍 xff0c 往届的学长和学姐们都用吴大正 xff0c 手里有第4版的也可以 xff0c 现在是新版第5版 xff0c 当然更好一些 其次是郑君
  • 成都信息工程大学809考研【软件工程】资料笔记真题~

    软件工程考研学长学姐们考研时自己总结的笔记题库 xff0c 不断完善 xff0c 笔记资料齐全 xff0c 取其精华去其糟粕 xff0c 直接只一套到手即可 xff01 包括考前给大家编写的三套模拟押题卷 xff0c 欢迎对比 xff01
  • 【24考研数学找研友】

    24数学考研 听说今年数学考研好难呀 xff0c 有没有同学一起考研一起复习的 大家一起看图交流一下
  • 【24北京交通大学901软件工程考研】

    有没有考北京交通大学901软工的同学 xff0c 一起组个队呀 xff0c 相互监督 xff5e 每日打卡学习
  • 【2024海南大学835软件工程考研笔记】

  • python中的装饰器(基础装饰器)

    文章目录 一 前置知识 高阶函数 xff0c 闭包1 高阶函数2 闭包 二 函数装饰器1 什么是装饰器 xff08 原理 xff09 xff1f 2 装饰器的实现3 何时执行装饰器4 wraps方法 三 类装饰器 一 前置知识 高阶函数 x
  • python中的装饰器二(带参数的装饰器)

    文章目录 前言 一 被装饰函数带参数二 被装饰函数有返回值三 装饰器带参数四 多个装饰器 前言 看大佬们写的代码看的我是眼花缭乱 xff0c 不知所云啊 真是感叹 xff0c 自己还看都看不懂 xff0c 人家就能写出来了 xff0c 人与
  • STlink、Jlink驱动一直安装失败的解决办法

    STlink Jlink驱动一直安装失败的解决办法 STlink驱动安装失败问题详情 Jlink驱动安装的问题也类似 xff0c 总是有一项安装失败 xff01 xff01 xff01 在经过各种尝试完毕之后 xff0c 怀疑是系统的问题
  • 数据可视化--实验四:地理数据可视化

    声明 xff1a 本文CSDN作者原创投稿文章 xff0c 未经许可禁止任何形式的转载 xff0c 原文链接 文章目录 概要实验过程Pyecharts实验结果 概要 学院 xff1a 计算机科学与技术学院实验日期 xff1a 2020 10
  • 课设-基于51单片机的智能小车(循迹+避障+APP控制)

    51单片机课设 智能小车 一 课设任务二 硬件设计及相关传感器模块1 车模2 51单片机3 红外循迹模块4 电机及驱动5 蓝牙模块6 硬件搭建 三 程序代码1 main c文件2 motor c文件 四 我的大学 造车 史 注 xff1a
  • 课设-基于51单片机+超声波模块的避障小车(源码+原理图+Protel仿真)

    基于51单片机 43 超声波模块的避障小车 xff08 源码 43 原理图 43 Protel仿真 xff09 一 功能二 模块2 1 电机驱动模块2 2 超声波模块 三 程序代码四 PCB原理图 一 功能 设计一辆利用超声波传感器来实现避
  • 路径规划(一):使用Matlab快速绘制栅格地图

    目录 一 Matlab快速绘制栅格地图1 几种常用的地图形式 xff1a 1 1 尺度地图 xff1a 1 2 拓扑地图 xff1a 1 3 语义地图 xff1a 2 栅格地图用于路径规划的优势 xff1a 3 matlab绘制栅格地图的核
  • 2、无人驾驶--路径规划算法:Dijkstra

    目录 2 Dijkstra2 1 算法简介2 2 算法思路具体流程 xff1a 2 3 算法具体实现2 3 1 程序详解 2 Dijkstra 声明 xff1a 本文是学习古月居 基于栅格地图的机器人路径规划算法指南 黎万洪 后写的笔记 x
  • 毕设--基于51单片机的温度报警器设计

    目录 1 简介2 设计要求与方案论证2 1 设计要求2 2 系统基本方案选择和论证2 2 1 单片机芯片的选择方案和论证2 2 2 温度传感器设计方案论证 2 3 电路设计最终方案决定 3 硬件设计介绍3 1 STC89C51介绍3 1 1
  • 基于51单片机的篮球比赛计时器

    目录 基于51单片机的篮球比赛计时器1 PCB原理图2 仿真图3 毕设要求 xff1a 4 总体方案设计5 程序源码6 资源下载 基于51单片机的篮球比赛计时器 注 xff1a 本毕设资源可在微信公众号 xff1a Kevin的学习站 中获
  • 毕设--基于51单片机数字电压表的设计

    目录 基于51单片机数字电压表的设计1 PCB原理图2 Proteus 仿真图3 设计目标3 1 基本功能3 2 主要技术参数 4 总设计框图5 硬件设计分析5 1 电源的设计5 2 单片机最小系统5 3 模数转换 6 软件设计的组成7 元
  • 基于51单片机的智能温控风扇(程序+仿真+原理图)

    目录 基于51单片机的智能温控风扇1 主要功能2 实验结果3 仿真工程4 原理图5 程序源码6 资源获取 基于51单片机的智能温控风扇 1 主要功能 基于51单片机的智能温控风扇 xff0c 通过DS180温度传感器采集温度 xff0c 并
  • 基于51单片机的八路竞赛抢答器设计

    目录 基于51单片机的八路抢答器设计1 主要功能2 仿真图3 测试图4 程序源码5 资源获取 基于51单片机的八路抢答器设计 1 主要功能 利用STC89C52单片机及外围接口实现的抢答系统 xff1b 在抢答过程中 xff0c 只有启动抢
  • 赛灵思-Zynq UltraScale+ MPSoC学习笔记汇总

    Zynq UltraScale 43 MPSoC学习目录 xff1a 1 赛灵思 Zynq UltraScale 43 MPSoCs xff1a 产品简介 2 赛灵思 Zynq UltraScale 43 MPSoC学习笔记 xff1a P
  • 数据可视化--实验五:高维非空间数据可视化

    声明 xff1a 本文CSDN作者原创投稿文章 xff0c 未经许可禁止任何形式的转载 xff0c 原文链接 文章目录 概要实验过程Pyecharts实验结果平行坐标系room1 6房间人员时长饼图 概要 学院 xff1a 计算机科学与技术