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

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")