西电-数据可视化-实验五-高维非空间数据可视化
一、实验内容
在某次大型会议中,为确保会议过程安全,会场使用了电子胸牌对场内人员的移动轨迹进行了监控。现经过处理,得到了某一天内人员在场内各个区域逗留的时间统计数据(time_allocate_day1.csv,课程资料库下载)。请根据这份数据,完成以下任务:
1、设计可视化方案,通过该方案可实现对人员的分类(绘制出图像即可)
2、请分析会场中room1~6的功能。
二、思路分析
(1)进入pyecharts官网修改demo即可
本实验涉及的图表类型如下:
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])) # <class 'numpy.int64>
# print(type(int(elem[i]))) # <class 'int'>
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”占比最多 => 工作人员休息区