You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.0 KiB
Python
96 lines
3.0 KiB
Python
import json
|
|
from igraph import Graph, plot
|
|
|
|
with open('data.json', 'r', encoding='utf-8') as file:
|
|
data = json.load(file)
|
|
|
|
g = Graph(directed=True)
|
|
|
|
vertices_num = len(data)
|
|
|
|
bbox =(2048, 2048)
|
|
|
|
node_labels_raw = [] #原始节点名
|
|
node_labels = [] #节点名
|
|
node_pos = [] #节点坐标
|
|
node_color = [] #节点颜色
|
|
node_label_color = [] #节点字体颜色
|
|
node_size = [] #节点大小
|
|
node_width = [] #节点宽度
|
|
node_height = [] #节点高度
|
|
|
|
edge_labels = []
|
|
edge_label_colors = []
|
|
edge_arrow_size = []
|
|
edges = []
|
|
|
|
for node_name in data:
|
|
#区域
|
|
node_info = data[node_name]
|
|
node_labels_raw.append(node_name)
|
|
is_battle = node_name.startswith('战斗-')
|
|
node_labels.append(node_name[3:] if is_battle else node_name)
|
|
node_pos.append(node_info['pos'])
|
|
node_color.append('red' if is_battle else 'gray')
|
|
node_label_color.append('black' if is_battle else 'black')
|
|
node_size.append(60 if is_battle else 80)
|
|
node_width.append(60 if is_battle else 80)
|
|
node_height.append(60 if is_battle else 80)
|
|
#key_get
|
|
if not 'key_get' in node_info:
|
|
continue
|
|
key_get = node_info['key_get']
|
|
if len(key_get) == 0:
|
|
continue
|
|
vertices_num += len(key_get)
|
|
for i in range(len(key_get)):
|
|
node_labels_raw.append(key_get[i])
|
|
node_labels.append(key_get[i])
|
|
node_pos.append((node_info['pos'][0],node_info['pos'][1]+0.1*(i+1)))
|
|
node_color.append('white')
|
|
node_label_color.append('blue')
|
|
node_size.append(0)
|
|
node_width.append(50)
|
|
node_height.append(20)
|
|
|
|
|
|
for node_name in data:
|
|
node_info = data[node_name]
|
|
for path_to in node_info['path_to']:
|
|
edges.append((node_labels_raw.index(node_name), node_labels_raw.index(path_to['name'])))
|
|
key_need = ''
|
|
key_need_color = 'red'
|
|
if 'key_need' in path_to:
|
|
key_need = path_to['key_need']
|
|
if key_need.startswith('战斗-'):
|
|
key_need = key_need[3:]
|
|
key_need_color = 'red'
|
|
elif key_need.startswith('单向门'):
|
|
key_need = '单向门'
|
|
key_need_color = "purple"
|
|
elif key_need.startswith('任务-'):
|
|
key_need = key_need[3:]
|
|
key_need_color = 'green'
|
|
else:
|
|
key_need = key_need
|
|
key_need_color = 'blue'
|
|
edge_labels.append(key_need)
|
|
edge_label_colors.append(key_need_color)
|
|
edge_arrow_size.append(1 if 'is_one_way' in path_to else 0.001)
|
|
|
|
g.add_vertices(vertices_num)
|
|
g.add_edges(edges)
|
|
g.vs["label"] = node_labels
|
|
g.vs["size"] = node_size
|
|
g.vs["width"] = node_width
|
|
g.vs["height"] = node_height
|
|
g.vs["label_color"] = node_label_color
|
|
g.vs["color"] = node_color
|
|
g.vs["shape"] = ["rectangle"] * len(data)
|
|
g.vs["font"] = ["SimHei"] * len(data)
|
|
g.es["label"] = edge_labels
|
|
g.es["label_color"] = edge_label_colors
|
|
g.es["font"] = ["SimHei"] * len(edge_labels)
|
|
g.es["arrow_size"] = edge_arrow_size
|
|
|
|
p = plot(g, layout=node_pos, bbox=bbox, margin=100, target="output_graph.png") |