70 lines
1.9 KiB
Python
70 lines
1.9 KiB
Python
from matplotlib import pyplot as plt
|
|
import networkx as nx
|
|
import matplotlib
|
|
matplotlib.use("Tkagg")
|
|
|
|
peple = [
|
|
("贾宝玉", "林黛玉"),("贾宝玉", "薛宝钗"),("林黛玉", "贾母"),("薛宝钗", "薛姨妈"),
|
|
("王熙凤", "贾琏"),("王熙凤", "贾母"),("贾宝玉", "贾政"),("贾政", "王夫人"),
|
|
("王夫人", "王熙凤"),("史湘云", "贾母"),("李纨", "贾珠"),("贾珠", "王夫人")
|
|
]
|
|
|
|
peple_set = set()
|
|
|
|
for i in peple:
|
|
for j in i:
|
|
peple_set.add(j)
|
|
|
|
people_list = list(peple_set)
|
|
|
|
G = nx.Graph()
|
|
G.add_nodes_from(people_list)
|
|
G.add_edges_from(peple)
|
|
|
|
pos = nx.spring_layout(G)
|
|
fig, ax = plt.subplots(figsize=(10, 8))
|
|
ax.set_xlim(-1, 1)
|
|
ax.set_ylim(-1, 1)
|
|
|
|
nx.draw_networkx(G, pos, ax=ax, font_family='STHeiti')
|
|
|
|
def is_within_bounds(x, y):
|
|
return -1 <= x <= 1 and -1 <= y <= 1
|
|
|
|
dragging_node = None
|
|
last_x, last_y = None, None
|
|
|
|
def on_press(event):
|
|
global dragging_node, last_x, last_y
|
|
for node, (x, y) in pos.items():
|
|
if (event.xdata - x) ** 2 + (event.ydata - y) ** 2 < 0.05:
|
|
dragging_node = node
|
|
last_x, last_y = event.xdata, event.ydata
|
|
break
|
|
|
|
def on_move(event):
|
|
global dragging_node, last_x, last_y
|
|
if dragging_node is not None:
|
|
dx = event.xdata - last_x
|
|
dy = event.ydata - last_y
|
|
new_x = pos[dragging_node][0] + dx
|
|
new_y = pos[dragging_node][1] + dy
|
|
|
|
if is_within_bounds(new_x,new_y):
|
|
pos[dragging_node] = (new_x,new_y)
|
|
last_x,last_y = event.xdata,event.ydata
|
|
|
|
ax.clear()
|
|
|
|
nx.draw_networkx(G,pos,ax=ax,font_family='STHeiti')
|
|
plt.draw()
|
|
|
|
def on_release(event):
|
|
global dragging_node
|
|
dragging_node = None
|
|
|
|
fig.canvas.mpl_connect('button_press_event',on_press)
|
|
fig.canvas.mpl_connect('motion_notify_event',on_move)
|
|
fig.canvas.mpl_connect('button_release_event',on_release)
|
|
|
|
plt.show() |