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

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 ②数据处理,把工作簿一和工作簿二的数据进行整合处理。得到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))
#列表转化为元组

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 ③通过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

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

结果展示:

 ④通过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

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

结果展示:

代码简化版:

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':
        pass
    else:
        dic[row[0]] = row[1]
re = hp['relation']
rela=[]
for row in re.values:
    if row[0]=='source':
        pass
    else:
        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下载

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pandas_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值