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