《红楼梦》人物关系可视化
《红楼梦》是我国四大名著之一,也是高中生必读书目之一。同学们在阅读红楼梦的时候,是否有以下困惑?人物太多?人物关系太复杂?
我们今天尝试着用信息技术中的数据可视化手段,对《红楼梦》中的人物关系进行可视化呈现,来挖掘错综复杂的人物关系网背后,作者想要表达的信息。
![最终效果](https://img-blog.csdnimg.cn/582b5aff09bc4a8ab22e4a416c8905c0.png)
1. 创建简单关系图
from pyecharts import options as opts
from pyecharts.charts import Graph
from pyecharts.globals import CurrentConfig
CurrentConfig.ONLINE_HOST = "C:/Users/Administrator/Desktop/pyecharts/"
#添加节点
nodes = [
opts.GraphNode(name='贾宝玉'),
opts.GraphNode(name='林黛玉'),
opts.GraphNode(name='王夫人')]
#添加关系
links = [
opts.GraphLink(source="贾宝玉", target="林黛玉",value="情人"),
opts.GraphLink(source="贾宝玉", target="王夫人",value="母子") ]
#生成关系图
c = (
Graph()
.add("", nodes, links,repulsion=4000,edge_label=opts.LabelOpts(is_show=True, position="middle", formatter="{c}"))
.set_global_opts(title_opts=opts.TitleOpts(title="简单关系图"))
)
c.render("简单关系图.html")
注意事项:
第四行CurrentConfig.ONLINE_HOST后面的地址改为echarts.min文件所在的绝对地址,将反斜杠改为斜杠,student后面也要加斜杠。不设置此操作,网页无法展示关系图。
![在这里插入图片描述](https://img-blog.csdnimg.cn/77d6512d525c49a4b11e5c8744ed444a.png)
任务1:
运行代码,思考关系图的基础要素是什么?
2.创建人物关系图
如何从文件中读取人名和关系?
(1)读取文件的方法:
import csv
with open('name.csv') as f:
reader = csv.reader(f)
for line in reader:
print(line[0])
输出结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2668a59dfe6641bfa6c3944ffde4a81c.png)
(2)按行读取人名并添加到nodes列表中
使用append()方法将读取的人名添加到nodes列表中
nodes = []
with open('name.csv') as f:
reader = csv.reader(f)
for line in reader:
nodes.append(opts.GraphNode(name=line[0]))
(3)按行读取关系并添加到links列表中
使用append()方法将读取的人名与对应的关系添加到links列表中
links=[]
with open('relation.csv') as f:
reader = csv.reader(f)
for line in reader:
links.append(opts.GraphLink(
source=line[0], target=line[1], value=line[2]))
任务2:
修改并整合代码,生成人物关系图
3.创建家族关系图
如何为人物添加家族属性?
第一步:为人物节点添加属性
nodes.append(opts.GraphNode(name=line[0],category=line[1]))
第二步:创建家族属性category列表
category= [
{'name':'贾家荣国府'},
{'name':'贾家宁国府'},
{'name':'史家'},
{'name':'王家'},
{'name':'林家'},
{'name':'薛家'},
{'name':'其他'}
]
第三步,生成关系图时加上category
c=(
Graph()
.add("", nodes, links, category,repulsion=4000, edge_label=opts.LabelOpts(is_show=True, position="middle", formatter="{c}"))
.set_global_opts(title_opts=opts.TitleOpts(title="红楼梦人物家族关系图")))
c.render("红楼梦人物家族关系图.html")
任务3:
整合代码,生成家族关系图
4.可视化分析
- 数量可视化:贾宝玉与林黛玉人物关系数量对比
- 规模可视化:荣国府和宁国府人口规模对比
- 颜色可视化:人物家族分布
- 大小可视化:人物出场频次