基于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