Проблема с установкой меток ребер в графе узлов с заданными координатами положения - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть кадр данных 11x11, называемый "loc", содержащий координаты положения узла (X, Y и Z) с именами узлов в качестве индекса.У меня есть другой фрейм данных "dist", содержащий расстояние между узлами, в то время как имена узлов указаны как в заголовках столбцов, так и в индексе.Я хочу построить график сети таким образом, чтобы каждый узел был помечен своим именем (индекс loc).Также каждый узел должен быть подключен к каждому другому узлу.

Однако я хочу, чтобы каждое ребро было обозначено расстоянием между двумя узлами.Я

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

#####  Example data similar to my actual data
coord     = np.random.randint(low=1, high=100, size=(11,3))  
lab       = ['AP', 'STA1', 'STA2', 'STA3', 'STA4', 'STA5', 'STA6', 'STA7', 
'STA8', 'STA9', 'STA10']
loc       = pd.DataFrame.from_records(coord, columns=['X', 'Y', 'Z'], 
index=lab)
d         = distance_matrix(loc,loc) # Distance between each device
dist      = pd.DataFrame.from_records(d, columns=lab)
dist      = dist.set_index(dist.columns)
dist      = dist.round(decimals=1)

##########  Network Plot without edges
coord         = np.random.randint(low=1, high=100, size=(11,3))  
lab           = ['AP', 'STA1', 'STA2', 'STA3', 'STA4', 'STA5', 'STA6', 
'STA7', 'STA8', 'STA9', 'STA10']
loc           = pd.DataFrame.from_records(coord, columns=['X', 'Y', 'Z'], 
index=lab)


d         = distance_matrix(loc,loc) # Distance between each device
dist      = pd.DataFrame.from_records(d, columns=lab)
dist      = dist.set_index(dist.columns)
dist      = dist.round(decimals=1)

# Add the nodes to graph
G=nx.Graph() 
for i in range(len(loc)):
    G.add_node(loc.index[i])

pos = loc.ix[:,0:2].transpose().to_dict(orient='list')

# Add edges
for i in range(len(loc)):
    for j in range(len(loc)):
        G.add_edge(loc.index[i], loc.index[j])

# Draw the network
fig, ax = plt.subplots(figsize=(5,5))
ax.axis('equal')
nx.draw_networkx(G, pos=pos, arrows= True, with_labels=True, node_size=600, 
node_shape='o', alpha=0.5, font_size=10) 
plt.show()

1) Данный код создает требуемый график, но без меток ребер.Я хочу нарисовать метки в центре края или где-нибудь, чтобы быть более читабельным.Помните, что edge_label представляет расстояние между двумя узлами (т. Е. Значение в кадре данных dist, для которого индекс и заголовок столбца имеют одинаковое значение).2) Можем ли мы нарисовать ту же сеть в 3D, так как узлы имеют три кордината (X, Y и Z).Как и в моем коде, я рисую только координаты X и Y.

1 Ответ

0 голосов
/ 30 декабря 2018

Для рисования меток ребер вам необходимо сначала добавить эти данные к краям:

G.add_edge(loc.index[i], loc.index[j], weight=d[i][j])

Затем для рисования меток вы можете вызвать nx.draw_networkx_edge_labels()

И все вместе:

import numpy as np
import pandas as pd
import networkx as nx
import scipy
import matplotlib.pyplot as plt

#####  Example data similar to my actual data
coord     = np.random.randint(low=1, high=100, size=(11,3))
lab       = ['AP', 'STA1', 'STA2', 'STA3', 'STA4', 'STA5', 'STA6', 'STA7',
'STA8', 'STA9', 'STA10']
loc       = pd.DataFrame.from_records(coord, columns=['X', 'Y', 'Z'],
index=lab)
d         = scipy.spatial.distance_matrix(loc,loc) # Distance between each device
dist      = pd.DataFrame.from_records(d, columns=lab)
dist      = dist.set_index(dist.columns)
dist      = dist.round(decimals=1)

##########  Network Plot without edges
coord         = np.random.randint(low=1, high=100, size=(11,3))
lab           = ['AP', 'STA1', 'STA2', 'STA3', 'STA4', 'STA5', 'STA6',
'STA7', 'STA8', 'STA9', 'STA10']
loc           = pd.DataFrame.from_records(coord, columns=['X', 'Y', 'Z'],
index=lab)


d         = scipy.spatial.distance_matrix(loc,loc) # Distance between each device
dist      = pd.DataFrame.from_records(d, columns=lab)
dist      = dist.set_index(dist.columns)
dist      = dist.round(decimals=1)

# Add the nodes to graph
G=nx.Graph()
for i in range(len(loc)):
    G.add_node(loc.index[i])

pos = loc.ix[:,0:2].transpose().to_dict(orient='list')

# Add edges
for i in range(len(loc)):
    for j in range(len(loc)):
        G.add_edge(loc.index[i], loc.index[j], weight='%.2f' % d[i][j])

# Draw the network
fig, ax = plt.subplots(figsize=(5,5))
ax.axis('equal')
nx.draw_networkx(G, pos=pos, arrows= True, with_labels=True, node_size=600, node_shape='o', alpha=0.5, font_size=10)
edge_labels = {(u, v): d['weight'] for u, v, d in G.edges(data=True)}
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=8, rotate=False)
plt.show()

Для 3D-печати вы можете использовать mplot3d , здесь - пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...