Создание многослойного графика - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь создать многослойный график, который связан между слоями через похожие узлы. Мой первый график (который должен быть слоем 1) представляет сходство косинусов между узлами. Второй график (который должен быть слоем 2) представляет расстояние между узлами.

Я могу создать и отобразить эти 2 графика отдельно, как показано ниже.

  • Небольшой график - Косинусное сходство
  • Большой график - Расстояние

Рисунок 1

two graphs separately

Однако я хотел бы создать многослойный взаимосвязанный график, как показано на следующем рисунке.

Рисунок 2

interconnected layer graph

Поскольку оба моих слоя имеют по 5 узлов, представляющих одни и те же векторы, я попытался реализовать создание каждого из этих графиков, как показано ниже, прежде чем использовать их в качестве взаимосвязанных слоев.

Код для создания отдельные графики

график сходства косинусов

# Creating an empty graph
G=nx.Graph()

#Adding the sentences as text string nodes
i=1

G.add_node("Clair hesitated before taking her first step into high school", pos=(i,i))
G.add_node("Being home-schooled all her life, high school seemed like a jungle",pos=(i,2))
G.add_node("She was not prepared to face this",pos=(2,1))
G.add_node("As fear overcame her, she considered turning back and walking 5 miles back home",pos=(2,3))
G.add_node("Just then, something stopped her and she was caught by surprise",pos=(4,2))

#Adding an edge

mapping = {"Clair hesitated before taking her first step into high school": '1',
           "Being home-schooled all her life, high school seemed like a jungle": '2',
           "She was not prepared to face this": '3',
           "As fear overcame her, she considered turning back and walking 5 miles back home": '4',
           "Just then, something stopped her and she was caught by surprise": '5'}

H = nx.relabel_nodes(G, mapping)

H.add_edge("1","2",weight=0.18114714)
H.add_edge("1","4",weight=0.02990695)
H.add_edge("1","5",weight=0.03590235)
H.add_edge("2","4",weight=0.08797787)
H.add_edge("2","5",weight=0.03461894)
H.add_edge("3","4",weight=0.05023782)
H.add_edge("3","5",weight=0.14783362)
H.add_edge("4","5",weight=0.13015703)

pos=nx.get_node_attributes(H,'pos')
nx.draw(H,pos, with_labels = True)
labels = nx.get_edge_attributes(H,'weight')
nx.draw_networkx_edge_labels(H,pos,edge_labels=labels)

print("Done")

график расстояний

аналогичен графику сходства косинусов H , я создал график расстояний, Y , отдельно.

Multi l ayer Network

Чтобы создать взаимосвязанный многоуровневый граф, как показано на рисунке 2 выше, я следовал приведенному здесь коду multinetx.

#Creating a Multi layer network using multinetx

N = 50
g1 = mx.erdos_renyi_graph(N,0.07,seed=218)
g2 = mx.erdos_renyi_graph(N,0.07,seed=211)
g3 = mx.erdos_renyi_graph(N,0.07,seed=208)

adj_block = mx.lil_matrix(np.zeros((N*3,N*3)))

adj_block[0:  N,  N:2*N] = np.identity(N)    # L_12
adj_block[0:  N,2*N:3*N] = np.identity(N)    # L_13
adj_block += adj_block.T

mg = mx.MultilayerGraph(list_of_layers=[g1,g2,g3], inter_adjacency_matrix=adj_block)

mg.set_edges_weights(inter_layer_edges_weight=4)

mg.set_intra_edges_weights(layer=0,weight=1)
mg.set_intra_edges_weights(layer=1,weight=2)
mg.set_intra_edges_weights(layer=2,weight=3)

fig = plt.figure(figsize=(15,5))
ax1 = fig.add_subplot(121)
ax1.imshow(mx.adjacency_matrix(mg,weight='weight').todense(), origin='upper',interpolation='nearest',cmap=plt.cm.jet_r)
ax1.set_title('supra adjacency matrix')

ax2 = fig.add_subplot(122)
ax2.axis('off')
ax2.set_title('regular interconnected network')
pos = mx.get_position(mg,mx.fruchterman_reingold_layout(mg.get_layer(0)), layer_vertical_shift=1.4, layer_horizontal_shift=0.0, proj_angle=7)
mx.draw_networkx(mg,pos=pos,ax=ax2,node_size=50,with_labels=False, edge_color=[mg[a][b]['weight'] for a,b in mg.edges()], edge_cmap=plt.cm.jet_r)
plt.show()

Однако я не уверен, как может соответствовать двум моим отдельным графикам (график сходства косинусов H и график расстояний Y), чтобы соответствовать этой многослойной структуре.

Любые предложения в этом отношении будут высоко оценены.

...