基于Harry Potter的数据可视化
目錄
目的:
任務(wù):
過(guò)程:
1.數(shù)據(jù)加載及整理
①加載必要的環(huán)境庫(kù)
②讀取文件:
③整理數(shù)據(jù)
2.全體人物關(guān)系網(wǎng)絡(luò)圖的繪制。
3.主角三人關(guān)系網(wǎng)絡(luò)圖的繪制。
4.保存圖片。
數(shù)據(jù)文件:
relation工作簿
?character工作簿
代碼部分:
① 通過(guò)openpyxl讀取xlsx的數(shù)據(jù)
?②數(shù)據(jù)處理,把工作簿一和工作簿二的數(shù)據(jù)進(jìn)行整合處理。得到name之間對(duì)應(yīng)的關(guān)系。
?③通過(guò)networkx繪制所有人物之間的社交關(guān)系圖。
?④通過(guò)networkx繪制哈利波特三個(gè)主角人物之間的社交關(guān)系圖
代碼簡(jiǎn)化版:
數(shù)據(jù)資源:
目的:
1.熟悉networkx和openpyxl使用
2.掌握python中數(shù)據(jù)整理的方法
3.掌握networkx中node和edge的使用
任務(wù):
1.數(shù)據(jù)加載及整理
2.繪制全體人物關(guān)系網(wǎng)絡(luò)圖
3.繪制主角三人的關(guān)系網(wǎng)絡(luò)圖?
4.保存圖片
過(guò)程:
1.數(shù)據(jù)加載及整理
①加載必要的環(huán)境庫(kù)
打開(kāi)python,加載openpyxl、networkx、matplotlib.pyplot這三個(gè)環(huán)境庫(kù)
②讀取文件:
通過(guò)openpyxl.load_workbook來(lái)讀取數(shù)據(jù)文件。
③整理數(shù)據(jù)
由于networkX是根據(jù)edge的關(guān)系來(lái)繪圖,我們需要將關(guān)系整理成為元組格式,如('Sirius Black', 'Harry Potter')編號(hào)轉(zhuǎn)名字
。將所有關(guān)系保存到列表里即可使用add_edges_from來(lái)繪制關(guān)系圖。
我們拿到的數(shù)據(jù)有兩個(gè)分頁(yè),分頁(yè)character含有全部的哈利波特全部的人物姓名和id號(hào)及任務(wù)簡(jiǎn)介;分頁(yè)relation含有帶有id號(hào)的人物關(guān)系,但是該分頁(yè)沒(méi)有人物的姓名。我們需要整理數(shù)據(jù)為以下格式:('Sirius Black', 'Harry Potter')
2.全體人物關(guān)系網(wǎng)絡(luò)圖的繪制。
整理好數(shù)據(jù)后,我們首先需要使用plt.figure(figsize = (40,30))調(diào)整畫(huà)布大小,然后建立無(wú)向圖,加邊的集合,繪制圖形,顯示圖形,最終結(jié)果參考下圖(此為實(shí)驗(yàn)成果物1):
3.主角三人關(guān)系網(wǎng)絡(luò)圖的繪制。
根據(jù)上圖我們可以看出由于作品設(shè)計(jì)到的人物眾多,展示全部關(guān)系較為雜亂,我們此處只展示與主角三人有直接關(guān)系的網(wǎng)絡(luò)圖,我們整理數(shù)據(jù),然后按照成果物1的步驟制作主角三人關(guān)系網(wǎng)絡(luò)圖。
此為成果物2.如下圖
4.保存圖片。
我們使用如下命令保存plt.savefig("文件名.png",format ="PNG"),使用時(shí)需注意,我們需要注釋掉show函數(shù)才能保存,注釋方法如下:#plt.show()
數(shù)據(jù)文件:
relation工作簿
source字段為來(lái)源id即對(duì)應(yīng)的姓名,target字段為目標(biāo)人物id姓名
?character工作簿
第二個(gè)工作簿character,id對(duì)應(yīng)第一個(gè)工作簿的id,需要將2個(gè)工作簿進(jìn)行結(jié)合,id轉(zhuǎn)化為name。以便后續(xù)可視化的進(jìn)行。
代碼部分:
① 通過(guò)openpyxl讀取xlsx的數(shù)據(jù)
from openpyxl import load_workbook #加載Excel woj=load_workbook(filename=r'D:\Gogle_download\harry potter.xlsx') #獲取表單名稱 names=woj.sheetnames #獲取表單對(duì)象 shett_object1=woj.worksheets[0]#relation #帶有id號(hào)的人物關(guān)系,但是該分頁(yè)沒(méi)有人物的姓名 shett_object2=woj.worksheets[1]#character #哈利波特全部的人物姓名和id號(hào)及任務(wù)簡(jiǎn)介 #行切片獲得數(shù)據(jù) ## values_only false:返回對(duì)象 true:返回單元格對(duì)應(yīng)的數(shù)據(jù) result=shett_object1.iter_rows(min_row=2,max_row=514,min_col=1,max_col=2,values_only=True) result=list(result) result2=shett_object2.iter_rows(min_row=2,max_row=66,min_col=1,max_col=3,values_only=True) result2=list(result2)?②數(shù)據(jù)處理,把工作簿一和工作簿二的數(shù)據(jù)進(jìn)行整合處理。得到name之間對(duì)應(yīng)的關(guān)系。
t1=[]#存放編號(hào) t2=[]#存放名字 for j in result2:t1.append(j[0])t2.append(j[1]) namedict=dict(zip(t1,t2)) #創(chuàng)建字典用于后續(xù)把編號(hào)轉(zhuǎn)化為名字 resultall=[] for j in result:resultall.append([namedict[j[0]],namedict[j[1]]]) #創(chuàng)建名字關(guān)系 resultall2=[] for j3 in resultall:resultall2.append(tuple(j3)) #列表轉(zhuǎn)化為元組?③通過(guò)networkx繪制所有人物之間的社交關(guān)系圖。
from matplotlib import pyplot as plt import networkx as nx plt.figure(figsize = (40,30))#調(diào)整畫(huà)布大小 G=nx.Graph() #節(jié)點(diǎn)為單個(gè)名字 G.add_nodes_from(namedict.values())#創(chuàng)建節(jié)點(diǎn) 通過(guò)獲得字典的鍵來(lái)得到 G.add_edges_from(resultall2)#邊的關(guān)系 nx.draw_networkx(G)#全體人物關(guān)系圖 #plt.show() plt.savefig("allrelation.png",format="PNG") #成果物1結(jié)果展示:
?④通過(guò)networkx繪制哈利波特三個(gè)主角人物之間的社交關(guān)系圖
三個(gè)主角分別為:赫敏、羅恩、哈利波特
#只畫(huà)與主角三人有關(guān)系的 #Hermione Granger #Harry Potter #Ron Weasley #只畫(huà)與主角有關(guān)系的 zhujiao=[] for j in result:if namedict[j[0]]=='Harry Potter' or namedict[j[0]]=='Hermione Granger' or namedict[j[0]]=='Ron Weasley' or namedict[j[1]]=='Harry Potter' or namedict[j[1]]=='Hermione Granger' or namedict[j[1]]=='Ron Weasley': zhujiao.append([namedict[j[0]],namedict[j[1]]])#找出主角所有的關(guān)系圖 zhujiaojiedian=[] for i in zhujiao:zhujiaojiedian.append(i[0])zhujiaojiedian.append(i[1]) #去重,去掉重復(fù)的名字 zhujiaojiedian=list(set(zhujiaojiedian)) from matplotlib import pyplot as plt import networkx as nx plt.figure(figsize = (40,30))#調(diào)整畫(huà)布大小 G2=nx.Graph() G2.add_nodes_from(zhujiaojiedian)#創(chuàng)建節(jié)點(diǎn) G2.add_edges_from(zhujiao)#邊的關(guān)系 nx.draw_networkx(G2)#全體人物關(guān)系圖 #plt.show() plt.savefig("zhujiao.png",format="PNG")#保存圖片 #成果物2結(jié)果展示:
代碼簡(jiǎn)化版:
from openpyxl import load_workbook #加載Excel hp=load_workbook(harry potter.xlsx') import networkx as nx import matplotlib.pyplot as plt cha=hp['character'] dic={} for row in cha.values:if row[0] =='id':passelse:dic[row[0]] = row[1] re = hp['relation'] rela=[] for row in re.values:if row[0]=='source':passelse:rela.append((dic[row[0]],dic[row[1]])) plt.figure(figsize=(30,20)) G=nx.Graph() G.add_edges_from(rela) nx.draw_networkx(G) plt.savefig("ht.png")數(shù)據(jù)資源:
基于HarryPotter的數(shù)據(jù)可視化,數(shù)據(jù)資源-Python文檔類資源-CSDN下載
總結(jié)
以上是生活随笔為你收集整理的基于Harry Potter的数据可视化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: js获取url链接中的域名部分
- 下一篇: 添加rviz插件解决gaol3dtool