西电-数据可视化-实验五-高维非空间数据可视化(pyecharts)

西电-数据可视化-实验五-高维非空间数据可视化(pyecharts),第1张

西电-数据可视化-实验五-高维非空间数据可视化(pyecharts) 西电-数据可视化-实验五-高维非空间数据可视化 一、实验内容

在某次大型会议中,为确保会议过程安全,会场使用了电子胸牌对场内人员的移动轨迹进行了监控。现经过处理,得到了某一天内人员在场内各个区域逗留的时间统计数据(time_allocate_day1.csv,课程资料库下载)。请根据这份数据,完成以下任务:

1、设计可视化方案,通过该方案可实现对人员的分类(绘制出图像即可)

2、请分析会场中room1~6的功能。

二、思路分析

(1)进入pyecharts官网修改demo即可

本实验涉及的图表类型如下:

parallel

pie(2)代码实现:

import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Parallel, Page, Pie


# 获取绘制平行坐标系的数据
def get_data_for_parallel(f):
    parallel_axis = []
    my_data = []
    for index, column in enumerate(f):
        parallel_axis.append({"dim": index, "name": column})
    for _, elem in f.iterrows():
        temp = []
        for i in range(24):
            # numpy.int64和python的int是不一样的
            # print(type(elem[i]))  # 
            # print(type(int(elem[i]))) # 
            temp.append(int(elem[i]))
        my_data.append(temp)
    return parallel_axis, my_data


def draw_parallel(f):
    parallel_axis, my_data = get_data_for_parallel(f)
    (
        Parallel(init_opts=opts.InitOpts(width="1500px", height="750px"))
        .add_schema(schema=parallel_axis)
        .add(
            series_name="人员分类",
            data=my_data,
            linestyle_opts=opts.LineStyleOpts(
                # 线宽
                width=0.5,
                # 透明度
                opacity=0.5,
                # 线的类型 solid/dashed/dotted
                type_="dashed",
                # 线的颜色
                # 线性渐变,前四个参数分别是 x0, y0, x2, y2, 范围从 0 - 1,相当于在图形包围盒中的百分比
                # 如果 globalCoord 为 `true`,则该四个值是绝对的像素位置
                color={
                   'type': 'linear',
                   'x': 0,
                   'y': 0,
                   'x2': 0,
                   'y2': 1,
                   'colorStops': [{'offset': 0, 'color': 'yellow'}, {'offset': 1, 'color': "purple"}],
                   "global": False
                }
            )
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(
                title="平行坐标系"
            )
        )
        .render("parallel.html")
    )


# 获取构建饼图的data
def get_data_for_pie(f1, f2):
    # id与其对应的身份
    id2identity = {}
    # 遍历id-身份表
    for _, elem in f2.iterrows():
        id2identity[elem[0]] = elem[1]
    data = []
    # room1-room6 循环六次
    for i in range(6, 12):
        # 初始化该房间不同身份的人停留的时间为0
        this_room = {"waiter": 0, "vip": 0, "reporter": 0, "participant": 0, "meeting": 0}
        # 构建infos
        infos = []
        for _, elem in f1.iterrows():
            infos.append([id2identity[int(elem[0])], int(elem[i])])
        # 遍历infos
        for info in infos:
            this_room[info[0]] += info[1]
        this_room = [(key, value) for key, value in this_room.items()]
        data.append(this_room)
    return data


# 绘制room1-room6的饼图
def draw_pie(f1, f2):
    data = get_data_for_pie(f1, f2)
    page = Page()
    for i, this_data in enumerate(data):
        name = "room" + str(i+1)
        pie = (
            Pie()
            .add("停留总时间", this_data)
            .set_global_opts(title_opts=opts.TitleOpts(title=name))
            .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
        )
        page.add(pie)
    page.render("pie.html")


if __name__ == '__main__':
    # 读取文件
    df1 = pd.read_excel("time_allocate_day1.xlsx")
    df2 = pd.read_excel("classifyday1.xlsx")
    # task1: 对人员分类 用平行坐标系表示
    draw_parallel(df1)
    # task2: 推断每一个房间的类型 饼图
    draw_pie(df1, df2)

(3)实验细节:
@一个易错点:

@在构造pie的数据时,初始化一个字典,然后遍历更新这个字典就可:

三、实验结果


Room1: 普通参会人员“meeting”占比最多 => 休息区Room2:嘉宾“VIP”占比最多 => 嘉宾休息区
Room3: 普通参会人员“meeting”占比最多 => 休息区Room4: 记者“reporter”占比最多 => 记者区

Room5: 黑客竞赛参赛者“participant”占比最多 => 黑客竞赛现场
Room6: 场内工作人员“waiter”占比最多 => 工作人员休息区

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5495868.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存