Python 中的柏青哥人物关系图
小说 柏青哥您可能想一目了然地看到人物之间的复杂关系。跨代人物之间的关系会让小说更有趣,但也可能很复杂,难以理解。 Python 可以轻松地将这些柏青哥表关系可视化并加以理解。
在本文中,我们将使用 Python 中的柏青哥人物关系图一步一步来,逐一分解代码的关键部分。在文章的最后,你会发现整个代码都集中在一起,所以请务必通读全文!
柏青哥》小说概述
小说 柏青哥这部史诗般的小说讲述了从日本殖民时期到 20 世纪 80 年代韩国和日本的一个移民家庭四代人的故事。主要人物之间的复杂关系与那个时代的冲突交织在一起,理解它们之间的联系对于欣赏这部小说至关重要。 苹果原创柏青哥).
描述关键人物
- 洪义禅师:禅师的父亲,代表家族的第一代。
- 杨进她是 Sun-ja 的母亲和 Hoon-i 的妻子,是一位尽职尽责的母亲。
- 禅宗小说的主人公,在困难面前为家人做出牺牲。
- Hansu Koh他是日本一位成功的商人,是禅师的初恋情人,也是小说冲突的主要根源。
- 巴基萨克他是她的丈夫,一位牧师,他们正在一起建设新生活。
- 帽子数量他是 Sunza 和 Baek Isaac 的儿子,也是其家族在日本经营弹珠机业务的第三代传人。
- 诺亚他是宣子和高汉秀的儿子,一直在为自己的身份而挣扎。
- 所罗门他是族长的儿子,代表第四代,在日本和美国之间过着复杂的生活。
- 悦子一个日本女人,她是墨祖的情人,有着复杂的家族史。
- 一种:悦子的女儿,与所罗门有感情纠葛。
- 由美:所罗门的情人,他与所罗门的关系使故事更加复杂。
- 庆熙雅各布的妻子,雅各布的兄弟,雅各布家族的另一位重要人物。
- Changsoo KimHansoo Goh 的忠实下属,是他的主要助手。
现在,让我们用 Python 来直观地描述这些字符之间的关系。
Python 中的柏青哥人物关系图
1. 安装所需软件包并设置韩文字体
首先,您需要安装必要的软件包并设置韩文字体,这将确保关系图中的韩文字符不会断开。
import networkx as nx
import matplotlib.pyplot as plt
from adjustText import adjust_text
import matplotlib.font_manager as fm
设置 # 韩文字体
font_path = 'C:/Windows/Fonts/NanumGothic.ttf' # 需要检查实际字体路径
fontprop = fm.FontProperties(fname=font_path, size=12)
plt.rc('font', family=fontprop.get_name())matplotlib 库用于将图形可视化、 调整文本是一个防止文本重叠的软件包。字体路径应设置为实际安装的字体路径,本例中为 NanumGothic。
定义人际关系并设置节点
定义 Pachinko 中主要人物之间的关系,建立图中的节点(人物)和边(关系线)。
创建 # 图形
G = nx.Graph()
定义 # 字符关系(设置字符之间的关系)
人物 = [
("Hoon Yi","禅师","父女")、
(杨瑾","禅师","母女")、
("Baek Isaac","Mohasu","富人")、
("Goh Hansu","诺亚","富人")、
(禅师"、"爱人")、
(禅师"、"帽子"、"帽子")、
("帽子","诺亚","兄弟")、
(帽子"、"所罗门"、"富人")、
("所罗门"、"由美"、"爱人")、
(悦子"、"鸠"、"爱人")、
("悦子"、"花"、"母女"),
("诺亚"、"秋子"、"爱人"),
("所罗门"、"一"、"爱人"),
("白-约瑟夫"、"京姬"、"情侣")、
(白约瑟夫"、"白以撒"、"兄弟")、
(高汉洙"、"金昌洙"、"朱钟")。
]
# 添加字符和关系行
for characters1, character2, relation in characters:
G.add_edge(character1, character2, relation=relation)该代码被称为 网络x 图书馆将人与人之间的关系作为节点和边连接起来。例如 (《洪崖》、《禅师》、《父女》)代表了勋和孙子之间的父女关系。
3. 设置世代颜色和布局
现在将这些字符分成几代,并根据它们的辈分给它们上色。
# 世代信息定义
generation_dict = {
"Hunyi":"第一代"、
"Yangjin":"第 1 代"、
宣子"第二代"
"白以撒""第二代"
"帽子的数量""第三代"
诺亚"第三代"
"悟饭":"第二代"
"所罗门"第四代
"由美""第三代
悦子"第三代"
"花""第四代
秋子"第三代
"白约瑟夫""第二代"
"京熙""第二代"
"Changsoo Kim":"其他"
}
根据 # 代设置颜色
color_map = {
"第一代":"浅蓝色
"第二代"浅绿色
"第三代"浅花色
"第四代"浅粉色
其他灰色
}
# 为每个节点指定特定世代的颜色
node_colours = [color_map[generation_dict[node]]] 为 Node in G.nodes()for node in G.nodes()]
# 设置布局(使用 spring_layout 均衡布局)
pos = nx.spring_layout(G)上面的代码是按照每个人的世代来着色的。例如,第一代人的颜色是 浅蓝色第二代是 浅绿第一次。 弹簧布局有助于确保以平衡的方式放置节点。
4. 绘制图形关系图
现在,我们将实际绘制图形,添加节点和边(关系线)以及关系描述。
绘制 # 图形
plt.figure(figsize=(12, 8))
绘制 # 节点
nx.draw_networkx_nodes(G, pos, node_color=node_colors, node_size=2000, edgecolors='black', linewidths=2)
绘制 # 关系线
nx.draw_networkx_edges(G, pos)
在 # 关系线之上添加关系描述
edge_labels = nx.get_edge_attributes(G, 'relation')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_family=fontprop.get_name(), font_size=12)
在 # 节点上显示人名
nx.draw_networkx_labels(G, pos, font_size=12, font_weight='bold', font_family=fontprop.get_name())
# 添加标题
plt.title("Pachinko 的主要人物关系图", size=20, fontweight='bold')
# 添加图例
import matplotlib.lines as mlines
legend_elements = [mlines.Line2D([], [], color=colour, marker='o', linestyle='', markersize=10, label=gen)
for gen, color in color_map.items()] [plt.legend(handles='')
plt.legend(handles=legend_elements, title="Generation", loc="lower center", bbox_too_anchor=(0.5, -0.05), ncol=5, fontsize=12, title_fontsize=12)
输出 # 图形
plt.axis('off')
plt.tight_layout()
plt.show()上面的代码会在图表中显示每个人的世代颜色、姓名和关系描述。 draw_networkx_nodes, draw_networkx_edges, draw_networkx_labels分别添加节点、关系线和人名,并使用 draw_networkx_edge_labels在关系描述中。
完整代码
import networkx as nx
import matplotlib.pyplot as plt
from adjustText import adjust_text
import matplotlib.font_manager as fm
设置 # 韩文字体
font_path = 'C:/Windows/Fonts/NanumGothic.ttf' 字体路径
fontprop = fm.FontProperties(fname=font_path, size=12)
plt.rc('font', family=fontprop.get_name())
创建 # 图形
G = nx.Graph()
定义 # 字符关系
字符 = [
("弘一"、"禅师"、"父女")、
("Yang Jin","禅师","母女"),、
(白以撒"、"婆婆"、"父亲"、"母亲"、"女儿")。
자"),
("吴汉苏"、"诺亚"、"富人")、
(禅师"、"情人")、("禅师"、"情人")、
(禅师"、"帽子"、"帽子")、
("帽子","诺亚","兄弟")、
(帽子"、"所罗门"、"富人")、
("所罗门"、"由美"、"爱人")、
(悦子"、"鸠"、"爱人")、
("悦子"、"花"、"母女"),
("诺亚"、"秋子"、"爱人"),
("所罗门"、"一"、"爱人"),
("白-约瑟夫"、"京姬"、"情侣")、
(白约瑟夫"、"白以撒"、"兄弟")、
(高汉洙"、"金昌洙"、"朱钟")。
]
# 添加字符和关系行
for characters1, character2, relation in characters:
G.add_edge(character1, character2, relation=relation)
定义 # 生成信息
generation_dict = {
"洪义":"第 1 代"、
"Yangjin":"第 1 代"、
宣子"第二代"
"白以撒""第二代"
"帽子的数量""第三代"
诺亚"第三代"
"悟饭":"第二代"
"所罗门"第四代
"由美""第三代
悦子"第三代"
"花""第四代
秋子"第三代
"白约瑟夫""第二代"
"京熙""第二代"
"Changsoo Kim":"其他"
}
根据 # 代设置颜色
color_map = {
"第一代":"浅蓝色
"第二代"浅绿色
"第三代"浅花色
"第四代"浅粉色
其他灰色
}
# 为每个节点指定特定世代的颜色
node_colours = [color_map[generation_dict[node]]] 为 Node in G.nodes()for node in G.nodes()]
设置 # 布局
pos = nx.spring_layout(G)
绘制 # 图形
plt.figure(figsize=(12, 8))
绘制 # 节点
nx.draw_networkx_nodes(G, pos, node_color=node_colors, node_size=2000, edgecolors='black', linewidths=2)
绘制 # 关系线
nx.draw_networkx_edges(G, pos)
在 # 关系线之上添加关系描述
edge_labels = nx.get_edge_attributes(G, 'relation')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_family=fontprop.get_name(), font_size=12)
在 # 节点上显示人名
nx.draw_networkx_labels(G, pos, font_size=12, font_weight='bold', font_family=fontprop.get_name())
# 添加标题
plt.title("Pachinko 的主要人物关系图", size=20, fontweight='bold')
# 添加图例
import matplotlib.lines as mlines
legend_elements = [mlines.Line2D([], [], color=colour, marker='o', linestyle='', markersize=10, label=gen)
for gen, color in color_map.items()] [plt.legend(handles='')
plt.legend(handles=legend_elements, title="Generation", loc="lower center", bbox_too_anchor=(0.5, -0.05), ncol=5, fontsize=12, title_fontsize=12)
输出 # 图形
plt.axis('off')
plt.tight_layout()
plt.show()总结
在本文中,我们学习了如何使用 Python 来可视化 Pachinko 中的人物关系。 用图形表示复杂的人物关系可以更容易地理解小说的流程。利用 Python 强大的数据可视化功能,您就能对复杂的叙事结构一目了然。 安装 VS CODE - Windows 这篇文章会帮你上路,加油吧!






