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