根据hlm.txt里的剧情,Python来分析《红楼梦》中人物关系,并且将人物关系通过networks展示出来

本文介绍如何使用Python编程语言,通过NetworkX库解析四个文本文件(hlm.txt,names.txt,People_edge.txt,People_node.txt),构建贾宝玉与金十二钗人物关系的网络图,展示了边的权重和节点属性信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下源码以及对源码的解释,希望可以帮助到大家!!!

现在有四个txt文件,其中hlm.txt是贾宝玉与金十二钗的某故事情节,names.txt中涉及贾宝玉与金十二钗涉及的名字,People_edge.txt中涉及人物之间关系权重,source  Target weight,People_node.txt中涉及人物名字,别名以及权重,ID,Lable,Weight

四个.txt文件提取:

链接:https://pan.baidu.com/s/1bwMnKncHEiBNo1uJ32JdVw 
提取码:uwy9

一.准备阶段:
1.导入相关库

import networkx as nx
import matplotlib.pyplot as plt
import matplotlib

2.防止结果图页面展示出现问题的预备工作
将中文字体为楷体,并解决负号显示为方框问题,
有助于解决中文显示异常的问题
因为matplotlib渲染器默认不支持中文,
所以需要使用到以下代码,不然最后显示图会全是框框

matplotlib.rcParams['font.sans-serif'] = ['KaiTi']  # 设置中文字体为楷体
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决负号'-'显示为方块的问题

3.如果不加上述两行代码,最终结果图会显示成这种:

二.代码实现阶段

1.打开名为hlm.txt的文件,并读取其中的内容,利用utf-8编码

with open('hlm.txt', 'r', encoding='utf-8') as file:
    hlm_plot = file.read()

2.从'names.txt'文件中读取内容, 并将其按行分割成一个名为names的列表

with open('names.txt', 'r', encoding='utf-8') as file:
    names = file.read().split('\n')

3.打开'People_edge.txt'文件, 并将文件中的每一行按照空格分割, 并将结果存入people_edges列表中,表示人物关系的边。

# 读取People_edge.txt
people_edges = []
with open('People_edge.txt', 'r', encoding='utf-8') as file:
    next(file)  # 跳过第一行,因为People_edge.txt中第一行数据不符合
    for line in file:
        source, target, weight = line.strip().split()
        people_edges.append((source, target, int(weight)))

4.打开'People_node.txt'文件, 并按行处理文件内容,将结果存入people_nodes字典中, 表示人物节点的属性信息。

people_nodes = {}
with open('People_node.txt', 'r', encoding='utf-8') as file:
    next(file)  # 跳过第一行
    for line in file:
        parts = line.strip().split(',')
        ID = parts[0]
        if len(parts) > 1:
            label = parts[1]
        else:
            label = ""
        if len(parts) > 2:
            weight = int(parts[2])
        else:
            weight = 0
        people_nodes[ID] = {'label': label, 'weight': weight}

5.创建了一个有向图对象, 用于存储人物关系的网络图。

G = nx.DiGraph()

6.循环遍历people_edges列表中的元素, 将边和对应的权重添加到有向图对象G中。

for edge in people_edges:
    G.add_edge(edge[0], edge[1], weight=edge[2])

7.使用matplotlib库创建一个新的画布, 并设置这个画布的大小为15x15英寸。 这些代码一起构成了数据的处理和网络图的创建过程。 这种分解可以帮助理解代码的执行过程,并弄清每个部分代码的功能

plt.figure(figsize=(15, 15))
pos = nx.spring_layout(G, k=0.4)  # 定义节点位置
# 绘制节点
nx.draw_networkx_nodes(G, pos, node_color='pink', node_size=1000)
# 绘制边
nx.draw_networkx_edges(G, pos, width=1, alpha=0.5, edge_color='black')
# 绘制节点的标签
nx.draw_networkx_labels(G, pos, font_size=12, font_family='sans-serif')
# 显示边的权重
edge_labels = {(edge[0], edge[1]): edge[2] for edge in people_edges}
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_color='red')

8.显示图

plt.axis('off')#关闭坐标轴的显示。
plt.title('Relationship between characters in "Dream of the Red Chamber"')#设置图的标题
plt.show()#显示整个图形

三.代码运行结果图

四.总代码

import networkx as nx
import matplotlib.pyplot as plt
import matplotlib
'''
以下两句代码解决了中文显示为框框的问题,
将中文字体为黑体,并解决负号显示为方框问题,
有助于解决中文显示异常的问题
因为matplotlib渲染器默认不支持中文,
所以需要使用到以下代码,不然最后显示图会全是框框
'''
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体为黑体
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决负号'-'显示为方块的问题
'''
1.
打开名为hlm.txt的文件,
并读取其中的内容,利用utf-8编码
'''
# 读取hlm.txt
with open('hlm.txt', 'r', encoding='utf-8') as file:
    hlm_plot = file.read()
'''
2.
从'names.txt'文件中读取内容,
并将其按行分割成一个名为names的列表
'''
# 读取names.txt
with open('names.txt', 'r', encoding='utf-8') as file:
    names = file.read().split('\n')
'''
3.
打开'People_edge.txt'文件,
并将文件中的每一行按照空格分割,
并将结果存入people_edges列表中,表示人物关系的边。
'''
# 读取People_edge.txt
people_edges = []
with open('People_edge.txt', 'r', encoding='utf-8') as file:
    next(file)  # 跳过第一行,因为People_edge.txt中第一行数据不符合
    for line in file:
        source, target, weight = line.strip().split()
        people_edges.append((source, target, int(weight)))
'''
4.
打开'People_node.txt'文件,
并按行处理文件内容,将结果存入people_nodes字典中,
表示人物节点的属性信息。
'''
# 读取People_node.txt
people_nodes = {}
with open('People_node.txt', 'r', encoding='utf-8') as file:
    next(file)  # 跳过第一行
    for line in file:
        parts = line.strip().split(',')
        ID = parts[0]
        if len(parts) > 1:
            label = parts[1]
        else:
            label = ""
        if len(parts) > 2:
            weight = int(parts[2])
        else:
            weight = 0
        people_nodes[ID] = {'label': label, 'weight': weight}
'''
5.
创建了一个有向图对象,
用于存储人物关系的网络图。
'''
# 创建一个有向图
G = nx.DiGraph()
'''
6.
循环遍历people_edges列表中的元素,
将边和对应的权重添加到有向图对象G中。
'''
# 添加边及其权重
for edge in people_edges:
    G.add_edge(edge[0], edge[1], weight=edge[2])
'''
7.
代码告诉matplotlib库要创建一个新的画布,
并设置这个画布的大小为15x15英寸。
这些代码一起构成了数据的处理和网络图的创建过程。
这种分解可以帮助理解代码的执行过程,并弄清每个部分代码的功能。
'''
# 创建人物关系的网络图
plt.figure(figsize=(15, 15))
'''
8.
使用 NetworkX 库的 spring_layout 函数为节点分配位置,k=0.4 是布局的参数。
'''
pos = nx.spring_layout(G, k=0.4)  # 定义节点位置
'''
9.
使用 NetworkX 库绘制节点,设置节点的颜色为浅蓝色,大小为1000。
'''
# 绘制节点
nx.draw_networkx_nodes(G, pos, node_color='pink', node_size=1000)
'''
10.
使用 NetworkX 库绘制图中的边,设置边的宽度为2,透明度为0.6,边的颜色为灰色。
'''
# 绘制边
nx.draw_networkx_edges(G, pos, width=1, alpha=0.5, edge_color='black')
'''
11.
使用 NetworkX 库为节点添加标签并设置标签的字体大小和字体系列。
'''
# 绘制节点的标签
nx.draw_networkx_labels(G, pos, font_size=12, font_family='sans-serif')
'''
12.
使用 NetworkX 库为节点添加标签并设置标签的字体大小和字体系列。
'''
# 显示边的权重
edge_labels = {(edge[0], edge[1]): edge[2] for edge in people_edges}
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_color='red')

# 显示图
plt.axis('off')#关闭坐标轴的显示。
plt.title('Relationship between characters in "Dream of the Red Chamber"')#设置图的标题
plt.show()#显示整个图形

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值