请选择 进入手机版 | 继续访问电脑版

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

[复制链接]
太阳神鹰 发表于 2021-1-3 12:18:16 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
数据可视化–实验六:条理和网络可视化、文本可视化


文章目次



概要



  • 学院:盘算机科学与技能学院
  • 实验日期:2020-10-17
  • 实验目标: 掌握条理和网络可视化、文本可视化工具方法
  • 实验内容:

    • 现有xx公司一个月内研发部门成员间的邮件往来记载(email_dev_inside.xlsx),请根据以下要求完成对该公司的研发部门的可视化分析:

      • 1、对邮件往来数据举行处置惩罚,选择符合的图表,展示公司研发部门的成员组织结构,分别找出每个群体的负责人。
      • 2、对邮件内容数据举行处置惩罚,分析研发部门以及每个群体中的主要工作内容。


  • 注:表格文件在我的资源中免费下载。名为“数据可视化实验–表格附件”。
实验过程

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

​ 在Pycharm中新建python项目,并引入pyecharts,openpyxl等须要包。
创建main.py,写入以下内容。
  1. #!/usr/bin/env python# coding:utf-8"""Name    : main.pyAuthor  : FTime    : 2020/10/17 21:03Desc    : 数据可视化实验六"""import copyimport openpyxlfrom pyecharts.charts import Graph, Tree, WordCloud, Pagefrom pyecharts import options as optsfrom pyecharts import globalsglobals._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, theCategoriesdef 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_bossdef 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_rankdef 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_contentdef 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 wordListdef 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_datadef 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:软件开辟文档管理

数据可视化–实验六:条理和网络可视化、文本可视化实验完成,两项实验效果均符合要求,实验乐成。

来源:https://blog.csdn.net/BlingblingFu/article/details/112062183
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )