欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

基于Harry Potter的数据可视化

发布时间:2023/12/16 编程问答 53 豆豆
生活随笔 收集整理的这篇文章主要介绍了 基于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的数据可视化的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。