파이썬으로 그리는 파친코 인물 관계도

소설 파친코를 읽다 보면 등장인물들의 복잡한 관계를 한눈에 보고 싶을 때가 있습니다. 여러 세대에 걸친 등장인물들의 관계는 소설을 더욱 흥미롭게 만들지만, 그만큼 복잡하고 이해하기 어렵기도 합니다. 하지만 파이썬을 활용하면 이러한 파친코 인물 관계도를 시각적으로 표현하여 쉽게 이해할 수 있습니다.

이 글에서는 파이썬으로 파친코 인물 관계도를 그리는 방법을 단계별로 설명하고, 주요 코드를 하나씩 자세히 설명합니다. 글 끝부분에서 전체 코드를 한 번에 확인할 수 있으니 끝까지 읽어주세요!

파친코 인물 관계도 포스트 그림

파친코 소설 개요

소설 파친코는 일제강점기부터 1980년대까지 한국과 일본을 배경으로 한 이민자 가족의 4세대를 다룬 서사 소설입니다. 주요 등장인물 간의 복잡한 관계와 시대적 갈등이 엮여 있어, 인물 간의 연결성을 이해하는 것이 소설 감상에 매우 중요합니다.(시간 나실 때 애플 오리지널 파친코도 즐겨보세요.)

주요 등장인물 설명

  • 훈이: 선자의 아버지로, 가족의 첫 번째 세대를 대표하는 인물입니다.
  • 양진: 선자의 어머니이자 훈이의 아내로, 헌신적인 어머니의 모습을 보여줍니다.
  • 선자: 소설의 주인공으로, 고난 속에서 가족을 위해 희생하며 살아가는 인물입니다.
  • 고한수: 선자의 첫사랑이자 소설 속 갈등을 불러일으키는 주요 인물로, 일본에서 성공한 사업가입니다.
  • 백이삭: 선자의 남편으로, 목사이며 선자와 함께 새로운 삶을 꾸려갑니다.
  • 모자수: 선자와 백이삭의 아들로, 일본에서 파친코 사업을 운영하며 가문의 3세대를 대표합니다.
  • 노아: 선자와 고한수의 아들로, 자신의 정체성에 대한 갈등을 겪으며 살아가는 인물입니다.
  • 솔로몬: 모자수의 아들로, 4세대를 대표하며 일본과 미국을 오가는 복잡한 삶을 살고 있습니다.
  • 에츠코: 모자수의 연인이며 일본인 여성으로, 복잡한 가정사를 가지고 있는 인물입니다.
  • 하나: 에츠코의 딸로, 솔로몬과 연인 관계를 맺는 인물입니다.
  • 유미: 솔로몬의 연인으로, 솔로몬과의 관계가 이야기를 더욱 복잡하게 만듭니다.
  • 경희: 백이삭의 형제인 백요셉의 아내로, 가문 내의 또 다른 중요한 인물입니다.
  • 김창수: 고한수의 충직한 부하로, 그의 주요 조력자입니다.

이제 이 등장인물들의 관계를 파이썬을 통해 시각적으로 그려보겠습니다.

파이썬으로 그리는 파친코 인물 관계도

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 라이브러리는 그래프를 시각화하는 데 사용되며, adjustText는 텍스트의 겹침을 방지하기 위한 패키지입니다. 폰트 경로는 실제 설치된 폰트 경로로 설정해야 하며, 여기서는 나눔고딕(NanumGothic)을 사용합니다.

2. 인물 관계 정의 및 노드 설정

파친코 주요 등장인물들 간의 관계를 정의하여 그래프의 노드(인물)와 에지(관계선)를 설정합니다.

# 그래프 생성
G = nx.Graph()

# 인물 관계 정의 (인물 간 관계를 설정)
characters = [
    ("훈이", "선자", "부녀"), 
    ("양진", "선자", "모녀"), 
    ("백이삭", "모자수", "부자"),
    ("고한수", "노아", "부자"),
    ("고한수", "선자", "연인"),
    ("선자", "모자수", "모자"),
    ("모자수", "노아", "형제"),
    ("모자수", "솔로몬", "부자"),
    ("솔로몬", "유미", "연인"),
    ("에츠코", "모자수", "연인"),
    ("에츠코", "하나", "모녀"),
    ("노아", "아키코", "연인"),
    ("솔로몬", "하나", "연인"),
    ("백요셉", "경희", "부부"),
    ("백요셉", "백이삭", "형제"),
    ("고한수", "김창수", "주종")
]

# 인물과 관계선 추가
for character1, character2, relation in characters:
    G.add_edge(character1, character2, relation=relation)

이 코드는 networkx 라이브러리를 사용하여 인물 간의 관계를 노드와 에지로 연결합니다. 예를 들어, ("훈이", "선자", "부녀")는 훈이와 선자 간의 부녀 관계를 나타냅니다.

3. 세대별 색상 및 레이아웃 설정

이제 등장인물들을 세대별로 구분하고, 세대에 따라 색상을 지정합니다.

# 세대 정보 정의
generation_dict = {
    "훈이": "1세대",
    "양진": "1세대",
    "선자": "2세대",
    "백이삭": "2세대",
    "모자수": "3세대",
    "노아": "3세대",
    "고한수": "2세대",
    "솔로몬": "4세대",
    "유미": "3세대",
    "에츠코": "3세대",
    "하나": "4세대",
    "아키코": "3세대",
    "백요셉": "2세대",
    "경희": "2세대",
    "김창수": "기타"
}

# 세대에 따른 색상 설정
color_map = {
    "1세대": "lightblue",
    "2세대": "lightgreen",
    "3세대": "lightcoral",
    "4세대": "lightpink",
    "기타": "gray"
}

# 각 노드에 세대별 색상 지정
node_colors = [color_map[generation_dict[node]] for node in G.nodes()]

# 레이아웃 설정 (spring_layout을 사용하여 균형 잡힌 배치)
pos = nx.spring_layout(G)

위 코드는 각 인물을 세대별로 구분하여 색상을 지정합니다. 예를 들어, 1세대는 lightblue, 2세대는 lightgreen으로 설정됩니다. spring_layout은 노드들이 균형 있게 배치되도록 도와줍니다.

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("파친코 주요 등장인물 관계도", size=20, fontweight='bold')

# 범례 추가
import matplotlib.lines as mlines
legend_elements = [mlines.Line2D([], [], color=color, marker='o', linestyle='', markersize=10, label=gen)
                   for gen, color in color_map.items()]
plt.legend(handles=legend_elements, title="세대", loc="lower center", bbox_to_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()

# 인물 관계 정의
characters = [
    ("훈이", "선자", "부녀"), 
    ("양진", "선자", "모녀"), 
    ("백이삭", "모자수", "부

자"),
    ("고한수", "노아", "부자"),
    ("고한수", "선자", "연인"),
    ("선자", "모자수", "모자"),
    ("모자수", "노아", "형제"),
    ("모자수", "솔로몬", "부자"),
    ("솔로몬", "유미", "연인"),
    ("에츠코", "모자수", "연인"),
    ("에츠코", "하나", "모녀"),
    ("노아", "아키코", "연인"),
    ("솔로몬", "하나", "연인"),
    ("백요셉", "경희", "부부"),
    ("백요셉", "백이삭", "형제"),
    ("고한수", "김창수", "주종")
]

# 인물과 관계선 추가
for character1, character2, relation in characters:
    G.add_edge(character1, character2, relation=relation)

# 세대 정보 정의
generation_dict = {
    "훈이": "1세대",
    "양진": "1세대",
    "선자": "2세대",
    "백이삭": "2세대",
    "모자수": "3세대",
    "노아": "3세대",
    "고한수": "2세대",
    "솔로몬": "4세대",
    "유미": "3세대",
    "에츠코": "3세대",
    "하나": "4세대",
    "아키코": "3세대",
    "백요셉": "2세대",
    "경희": "2세대",
    "김창수": "기타"
}

# 세대에 따른 색상 설정
color_map = {
    "1세대": "lightblue",
    "2세대": "lightgreen",
    "3세대": "lightcoral",
    "4세대": "lightpink",
    "기타": "gray"
}

# 각 노드에 세대별 색상 지정
node_colors = [color_map[generation_dict[node]] 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("파친코 주요 등장인물 관계도", size=20, fontweight='bold')

# 범례 추가
import matplotlib.lines as mlines
legend_elements = [mlines.Line2D([], [], color=color, marker='o', linestyle='', markersize=10, label=gen)
                   for gen, color in color_map.items()]
plt.legend(handles=legend_elements, title="세대", loc="lower center", bbox_to_anchor=(0.5, -0.05), ncol=5, fontsize=12, title_fontsize=12)

# 그래프 출력
plt.axis('off')
plt.tight_layout()
plt.show()

마무리

이 글에서는 파이썬을 사용해 파친코 인물 관계도를 시각화하는 방법을 배웠습니다. 복잡한 인물 간 관계를 그래프 형식으로 나타내면 소설의 흐름을 더 쉽게 이해할 수 있습니다. 파이썬의 강력한 데이터 시각화 기능을 활용하여, 복잡한 이야기 구조도 한눈에 파악할 수 있는 방법을 직접 실행해 보세요. VS CODE 설치 – 윈도우 기준 포스트가 여러분을 그 길로 안내해 드릴겁니다. 화이팅!

유사한 게시물