資料視覺化--實驗五:高維非空間資料視覺化
資料視覺化–實驗五:高維非空間資料視覺化
概要
- 學院:電腦科學與技術學院
- 實驗日期:2020-10-15
- 實驗目的: 掌握高維非空間資料視覺化
- 實驗內容:
- 在某次大型會議中,為確保會議過程安全,會場使用了電子胸牌對場內人員的移動軌跡進行了監控。現經過處理,得到了某一天內人員在場內各個區域逗留的時間統計資料(time_allocate_day1.csv)。請根據這份資料,完成以下任務:
- 1、設計視覺化方案,要求通過該方案可以實現對人員的分類(分類結果已給出,僅繪製出影像即可)
- 2、請根據上述影像,分析會場中room1~6的功能。
- 在某次大型會議中,為確保會議過程安全,會場使用了電子胸牌對場內人員的移動軌跡進行了監控。現經過處理,得到了某一天內人員在場內各個區域逗留的時間統計資料(time_allocate_day1.csv)。請根據這份資料,完成以下任務:
- 注:表格檔案在我的資源中免費下載。名為“資料視覺化實驗–表格附件”。
實驗過程
本次實驗選擇程式設計類工具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 getRoomData():
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(getRoomData())
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訪問,所以可以認為是嘉賓休息區
- Room4絕大多是reporter訪問,所以可以認為Room4是記者區
- Room5絕大多是participant訪問,所以可以認為Room4是黑客競賽現場
- Room6絕大多是waiter訪問,所以可以認為Room4是工作人員休息區
所以結論為:Room1:休息區 Room2:嘉賓休息區 Room3:休息區 Room4:記者區 Room5:黑客競賽現場 Room6:工作人員休息區
資料視覺化–實驗五:高維非空間資料視覺化實驗完成,兩項實驗結果均符合要求,實驗成功。
相關文章
- 資料視覺化實踐視覺化
- FUSE實驗室:Twitter資料視覺化視覺化
- Geopandas——從“視覺化”到“字母化”的空間資料分析視覺化
- 資料看板視覺化視覺化
- 資料視覺化【十五】視覺化
- 大資料視覺化大資料視覺化
- 警惕“資料視覺化”視覺化
- 資料視覺化基本原理——視覺化模型視覺化模型
- 資料視覺化與資訊視覺化怎麼搞?視覺化
- 遇見大資料視覺化 : 那些 WOW 的資料視覺化案例大資料視覺化
- 什麼是資料視覺化,為什麼資料視覺化很重要?視覺化
- 視覺化之資料視覺化最強工具推薦視覺化
- 新冠肺炎資料視覺化視覺化
- 資料視覺化的秘密視覺化
- 視覺化中的資料視覺化
- 如何看待資料視覺化?視覺化
- Matlab資料視覺化Matlab視覺化
- 資料視覺化的作用視覺化
- 細談資料視覺化視覺化
- 三維視覺化設計軟體,可以實現資料視覺化的軟體有哪些視覺化
- [Echarts視覺化] 二.php和ajax連線資料庫實現動態資料視覺化Echarts視覺化PHP資料庫
- 資料視覺化能否代替資料分析視覺化
- 分享20份大屏視覺化模板,輕鬆實現資料視覺化視覺化
- 資料視覺化的基本原理——視覺通道視覺化
- (在模仿中精進資料視覺化03)OD資料的特殊視覺化方式視覺化
- 資料視覺化學習資源視覺化
- 什麼是資料視覺化?hightopo資料視覺化助力企業數字化視覺化
- Python 如何實現資料視覺化Python視覺化
- 資料視覺化之下發圖實踐視覺化
- 大資料視覺化該如何實現大資料視覺化
- 使用Echarts來實現資料視覺化Echarts視覺化
- 資料視覺化實用乾貨分享視覺化
- python 資料視覺化利器Python視覺化
- pyecharts做資料視覺化(二)Echarts視覺化
- python資料視覺化——echartsPython視覺化Echarts
- 視覺化資料分析軟體視覺化
- 如何做好資料視覺化視覺化
- 資料視覺化的藝術視覺化