数据可视化--实验六:层次和网络可视化、文本可视化

2023-05-16

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

文章目录

    • 概要
    • 实验过程
      • Pyecharts
      • 实验结果
      • 邮件往来网络图
      • 职位树图
      • 邮件主题词云图
    • 实验结论

概要

  • 学院:计算机科学与技术学院
  • 实验日期:2020-10-17
  • 实验目的: 掌握层次和网络可视化、文本可视化工具方法
  • 实验内容:
    • 现有xx公司一个月内研发部门成员间的邮件往来记录(email_dev_inside.xlsx),请根据以下要求完成对该公司的研发部门的可视化分析:
      • 1、对邮件往来数据进行处理,选择合适的图表,展示公司研发部门的成员组织结构,分别找出每个群体的负责人。
      • 2、对邮件内容数据进行处理,分析研发部门以及每个群体中的主要工作内容。
  • 注:表格文件在我的资源中免费下载。名为“数据可视化实验–表格附件”。链接
  • 因为即使我设置了不要积分,CSDN还是不让免费下载,可以请直接到GitHub下载:GitHub链接

实验过程

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

Pyecharts

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

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

#!/usr/bin/env python
# coding:utf-8
"""
Name    : main.py
Author  : F
Time    : 2020/10/17 21:03
Desc    : 数据可视化实验六
"""
import copy
import openpyxl
from pyecharts.charts import Graph, Tree, WordCloud, Page
from pyecharts import options as opts
from pyecharts import globals

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

bigBoss = ['1007', '1059', '1068']


def getData():
    filename = "email_dev_inside.xlsx"
    ws = openpyxl.load_workbook(filename)['Sheet1']
    theData, resNodes, theLinks, theCategories, theNodes = [], [], [], [], set()
    for i in range(2, ws.max_row + 1):
        row = str(i)
        theData.append([ws['G' + row].value[:4], ws['H' + row].value[:4], ws['I' + row].value])
        theLinks.append({'source': ws['G' + row].value[:4], 'target': ws['H' + row].value[:4]})
        theNodes.add(ws['G' + row].value[:4])
        theNodes.add(ws['H' + row].value[:4])
    for node in theNodes:
        resNodes.append({'name': node, 'symbolSize': 1, 'draggable': 'False', 'value': 1, 'category': '',
                         'label': {'normal': {'show': 'False'}}})
    return theData, resNodes, theLinks, theCategories


def drawEmailGraph(graph_nodes: list, graph_links: list, graph_categories: list):
    Graph(opts.InitOpts(width="2000px", height="2000px")).add(
        "",
        graph_nodes,
        graph_links,
        graph_categories,
        repulsion=50,
        linestyle_opts=opts.LineStyleOpts(curve=0.2),
        label_opts=opts.LabelOpts(is_show=False),
    ).set_global_opts(
        legend_opts=opts.LegendOpts(is_show=False),
        title_opts=opts.TitleOpts(title="研发部邮件来往图"),
    ).render("研发部邮件来往图.html")


def getLittleBoss(big_boss: list):
    little_boss = {}
    for bBoss in big_boss:
        little_boss[bBoss] = set()
    for link in links:
        if link['source'] in big_boss and link['target'] not in bigBoss:
            little_boss[link['source']].add(link['target'])
        elif link['target'] in big_boss and link['source'] not in bigBoss:
            little_boss[link['target']].add(link['source'])
    for k, v in little_boss.items():
        little_boss[k] = list(v)
        little_boss[k].sort()
    return little_boss


def getRank():
    the_rank = {}
    for bBoss in bigBoss:
        the_rank[bBoss] = {}
    littleBoss = getLittleBoss(bigBoss)
    for k, v in littleBoss.items():
        employee = getLittleBoss(v)
        for lBoss in v:
            the_rank[k][lBoss] = employee[lBoss]
    return the_rank


def getGroupEmail():
    email_content = copy.deepcopy(rank)
    for bBoss, groups in email_content.items():
        for lBoss, employeeList in groups.items():
            email_content[bBoss][lBoss] = getListEmail(employeeList)
    return email_content


def getListEmail(theEmployeeList: list):
    emailContent = {}
    wordList = []
    for d in data:
        if d[0] in theEmployeeList or d[1] in theEmployeeList:
            if emailContent.__contains__(d[2]):
                emailContent[d[2]] += 1
            else:
                emailContent[d[2]] = 0
    for k, v in emailContent.items():
        wordList.append(tuple((k, str(v))))
    return wordList


def getTreeData():
    tree_data, children = {'name': '成员结构图', 'children': []}, []
    for bBoss, groups in rank.items():
        tree_data['children'].append({'name': bBoss, 'children': []})
        for lBoss, employeeList in groups.items():
            for employee in employeeList:
                children.append({'name': employee, 'value': 1})
            tree_data['children'][tree_data['children'].__len__() - 1]['children'].append(
                {'name': lBoss, 'children': children})
            children = []
    return tree_data


def drawTree(tree_data):
    Tree(opts.InitOpts(width="3500px", height="2000px")).add(
        "",
        [tree_data],
        collapse_interval=2,
        orient="TB",
        initial_tree_depth=-1,
        label_opts=opts.LabelOpts(
            position="top",
            horizontal_align="right",
            vertical_align="middle",
            rotate=-90,
        ),
    ).set_global_opts(title_opts=opts.TitleOpts(title="成员结构图")).render("成员结构图.html")


def drawWordCloud(cloud_data: dict):
    page = Page()
    for bBoss, groups in cloud_data.items():
        for lBoss, employeeList in groups.items():
            wordCloud = WordCloud()
            wordCloud.add(series_name=bBoss + '-' + lBoss + "邮箱内容分析", data_pair=employeeList,
                          word_size_range=[6, 66]).set_global_opts(
                title_opts=opts.TitleOpts(
                    title=bBoss + '-' + lBoss + "邮箱内容分析", title_textstyle_opts=opts.TextStyleOpts(font_size=23)
                ),
                tooltip_opts=opts.TooltipOpts(is_show=True),
            )
            page.add(wordCloud)
    page.render("邮箱内容分析.html")


if __name__ == '__main__':
    data, nodes, links, categories = getData()  # 从xlsx拿到数据
    rank = getRank()  # 拿到整个阶级顺序
    drawEmailGraph(nodes, links, categories)  # 画出邮件来往网络图
    drawTree(getTreeData())  # 画出阶级图
    drawWordCloud(getGroupEmail())  # 画出每个群体的邮件内容词云

# 由EmailGraph可见,研发部分为3个群体。群体负责人的邮箱用户名依次是1007,1059,1068。
# 群体之间都不会互相通信,同时每个群体又分为多个小群体,小群体之间同样也不会互相通信。
# 拿到3个大群体的负责人之后,可以拿到这三个人的通信记录,便可以得到每个小群体的主要负责人。
# 同样地,可以拿到每个小群体的成员,拿的时候要注意避免将3个大群体的负责人认作为小群体的成员。
# 然后对每个大群体和小群体的邮件内容生成词云,即可获得每个群体的工作内容。

# 由Tree可以清晰地看出来部门的层次
# 由WordCloud可以看出来每个群体的主要工作内容

代码流程:

  • 读取Excel文件email_dev_inside.xlsx拿到往来邮件的邮箱用户名(四位数字)和邮件主题。
  • 根据往来邮件的邮箱用户名画出网络图,观察部门群体形态。
  • 根据部门群体形态可以判断出研发部分为3个群体。群体负责人的邮箱用户名依次是1007,1059,1068。群体之间都不会互相通信,同时每个群体又分为多个小群体,小群体之间同样也不会互相通信。
  • 根据群体负责人和小群体负责人,划分出部门的职位树图。
  • 根据划分的不同小群体及其邮件主题,画出每个小群体的邮件主题词云图。
  • 观察词云图,可以得出每个群体的主要工作内容。

实验结果

邮件往来网络图

邮件往来网络图如下所示,可以通过网络图可以得出主要负责人。

在这里插入图片描述

对上图进行分析:

  • 此研发部门主要分为3个群体,负责人的邮箱用户名依次是1007,1059和1068
  • 每个群体又分为不同的小群体,并且每个小群体中有一个负责人。
  • 每个大群体之间不会相互通信,每个小群体之间也不会相互通信。

职位树图

在这里插入图片描述

对上图进行分析:

  • 可以清晰地看出整个部门的结构层次,图中数字为邮箱用户名。

邮件主题词云图

在这里插入图片描述

对上图进行分析:

  • 由邮件主题词云图可以看出每个小群体的主要工作,以负责人邮箱用户名为索引,结论如下:
  • 1007
    • 1087:技术分享安排,部署与计划
    • 1092:需求、API、项目计划、问题与风险
    • 1115:前端开发、测试、配置、部署
    • 1125:概要设计、文档撰写
    • 1172:开发设计、实施方案
    • 1192:特殊字段说明、用户管理与例会
    • 1199:后端开发、文档接口与平台
    • 1224:软件部署运维
    • 1230:软件测试
    • 1281:软件部署与实施测试
  • 1059
    • 1057:软件开发实施监管
    • 1058:软件概要设计
    • 1079:技术分享
    • 1080:需求调研、设计概要
    • 1096:软件实施
    • 1101:系统配置子系统相关
    • 1119:软件实施与数据分析
    • 1143:总监管
    • 1155:特殊字段说明
    • 1211:软件开发文档撰写
    • 1228:软件实施与地图配置
    • 1376:需求调研与传输设置、特殊字段处理
    • 1487:系统规划,需求与原型设计
  • 1068
    • 1060:地图配置
    • 1098:工程初验
    • 1100:平台配置设置
    • 1154:地图配置
    • 1191:工程测试与终验
    • 1207:项目测试数据处理
    • 1209:软件开发文档管理

实验结论

  • 研发部负责人树状图和其下人员的主要工作如下所示,其中数字为人员邮箱用户名(即邮箱前四位数字)
  • 1007
    • 1087:技术分享安排,部署与计划
    • 1092:需求、API、项目计划、问题与风险
    • 1115:前端开发、测试、配置、部署
    • 1125:概要设计、文档撰写
    • 1172:开发设计、实施方案
    • 1192:特殊字段说明、用户管理与例会
    • 1199:后端开发、文档接口与平台
    • 1224:软件部署运维
    • 1230:软件测试
    • 1281:软件部署与实施测试
  • 1059
    • 1057:软件开发实施监管
    • 1058:软件概要设计
    • 1079:技术分享
    • 1080:需求调研、设计概要
    • 1096:软件实施
    • 1101:系统配置子系统相关
    • 1119:软件实施与数据分析
    • 1143:总监管
    • 1155:特殊字段说明
    • 1211:软件开发文档撰写
    • 1228:软件实施与地图配置
    • 1376:需求调研与传输设置、特殊字段处理
    • 1487:系统规划,需求与原型设计
  • 1068
    • 1060:地图配置
    • 1098:工程初验
    • 1100:平台配置设置
    • 1154:地图配置
    • 1191:工程测试与终验
    • 1207:项目测试数据处理
    • 1209:软件开发文档管理

数据可视化–实验六:层次和网络可视化、文本可视化实验完成,两项实验结果均符合要求,实验成功。

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

数据可视化--实验六:层次和网络可视化、文本可视化 的相关文章

随机推荐

  • 路径规划(一):使用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 计算机科学与技术
  • 7、AUTOSAR MCAL入门-实战:I/O驱动组

    7 AUTOSAR MCAL入门 实战 xff1a I O驱动组 在第三节中有介绍AUTOSAR 把MCAL 抽象分为4个驱动组 xff0c 分别为 xff1a 微控制器驱动组 xff0c 存储器驱动组 xff0c 通信驱动组 输入 输出驱
  • FreeRTOS学习笔记:FreeRTOS启动方式及流程

    FreeRTOS启动方式及流程 FreeRTOS有两种比较流行的启动方式 1 方式一 xff1a 在main函数中创建所有任务 具体说明 xff1a 在main函数中将硬件初始化 RTOS系统初始化 xff0c 创建所有的任务 xff0c
  • 树莓派4B与Android之缘——树莓派下LineageOS(Android 9)系统开机联网与远程控制

    一 树莓派连接屏幕 1 找到树莓派的micro hdmi口 xff0c 是视频图像的输出口 xff0c 见下图中的MICRO HDMI PORTS 2 连接屏幕 xff08 1 xff09 如果显示屏输入端口是HDMI xff0c 就用mi
  • Deep SDF 、NeuS学习

    DeepSDF Learning Continuous Signed Distance Functions for Shape Representation xff1a 学习用于形状表示的连续有符号距离函数 NeuS Learning Ne
  • layui 引入方式

    layui xff08 谐音 xff1a 类UI 是一款采用自身模块规范编写的前端 UI 框架 xff0c 遵循原生 HTML CSS JS 的书写与组织形式 xff0c 门槛极低 xff0c 拿来即用 其外在极简 xff0c 却又不失饱满
  • ubuntu20.04安装ROS及常见问题

    ubuntu20 04安装ROS及常见问题 一 ubuntu安装参考 xff08 双系统 xff09 1 ios镜像官网下载地址 xff1a https releases ubuntu com ga 61 2 239339907 18418
  • 在jetson xavier nx上配置orbslam3,带稠密重建

    这里写自定义目录标题 主要记录一下踩过的各种坑 xff0c 包括从配置开发板系统到配置orbslam3一条龙服务 xff0c 带cuda加速的opencv3 4 5开发板刷系统将系统移植到M 2硬盘上Sdkmanager安装cuda cud
  • ROS入门教程(五)—— RViz仿真

    上篇文章我们介绍了URDF文件的导出 xff0c 本文将继上文介绍安装完导出URDF文件后 xff0c 如何在机器人操作系统 ROS 中显示 xff0c 并且让它动起来 目录 前言 RViz机器人模型可视化 launch启动RViz配置文件
  • js几种继承

    提示 xff1a 主要是原型链继承 构造函数继承 原型链加构造函数继承 寄生组合式继承 一 原型链继承 子类想要继承父类的属性和方法 xff0c 可以将其原型对象指向父类的实例 xff0c 根据原型链就可以使用到父类的方法和属性 父类 fu
  • C++ 学习(基础语法篇)

    一 基础语法 1 1 C 43 43 简介 C 43 43 是一种静态类型的 编译式的 通用的 大小写敏感的 不规则的编程语言 xff0c 支持过程化编程 面向对象编程和泛型编程 C 43 43 是 C 的一个超集 xff0c 事实上 xf
  • 数据可视化--实验六:层次和网络可视化、文本可视化

    声明 xff1a 本文CSDN作者原创投稿文章 xff0c 未经许可禁止任何形式的转载 xff0c 原文链接 文章目录 概要实验过程Pyecharts实验结果邮件往来网络图职位树图邮件主题词云图 实验结论 概要 学院 xff1a 计算机科学