Python Networkx: края не принимают правильный цвет при указании позиций узлов - PullRequest
2 голосов
/ 30 мая 2020

Я довольно новичок в Python и начал изучать networkx для построения графика или дорожной сети. Я должен указать позиции узлов. Цвет края должен зависеть от значений краев. Я пробовал использовать фрейм данных pandas для генерации краев. Цвета краев работают нормально, когда положение не указано. Пример прилагается.

Без указания позиций

# Build a dataframe with your connections
df = pd.DataFrame({ 'from':['A', 'B', 'C','A'], 'to':['D', 'A', 'E','C'], 'value':[1, 10, 5, 5]})
df

# Build your graph
G=nx.from_pandas_edgelist(df, 'from', 'to', create_using=nx.Graph() )

# Custom the nodes:
nx.draw(G, with_labels=True, node_color='skyblue', node_size=1500, edge_color=df['value'], width=10.0, edge_cmap=plt.cm.Blues)

Здесь цвета краев идеальные

enter image description here

При указании позиций

pos = {'A': (0,1), 'D': (1,2) , 'B': (2,3) , 'C': (6,5), 'E': (0,0)}

nx.draw(G, pos, with_labels=True, node_color='skyblue', node_size=1500, edge_color=df['value'], width=10.0, edge_cmap=plt.cm.Blues)

Здесь позиции узлов идеальны, но цвета краев в соответствии со значением неправильные:

enter image description here

Я также попытался разместить следующую позицию -

df2 = pd.DataFrame({ "Nodes": ['A','D','B','C','E'], "x": [0,1,2,6,0], "y": [1,2,3,5,0]})
for i in df2.index:
    G.add_node(df2.loc[i, "Nodes"], df2=(nodes.loc[i, "x"], df2.loc[i, "y"]))

Но проблема с выводом осталась прежней.

1 Ответ

1 голос
/ 30 мая 2020

Действительно, как вы упомянули, цвет края определяется значениями краев, поскольку значения edge_color numeri c отображаются в цвета через указанный edge_cmap. Путаница здесь вызывает конкретное c расположение координат, так как соединяющий край (A,D) перекрывается соединяющим (A,B):

pos = {'A': (0,1), 'D': (1,2) , 'B': (2,3) , 'C': (6,5), 'E': (0,0)}

enter image description here

Если немного изменить координаты D, вы увидите, что край имеет ожидаемый цвет:

pos = {'A': (0,1), 'D': (4,1) , 'B': (2,3) , 'C': (6,5), 'E': (0,0)}

nx.draw(G, pos, 
        with_labels=True, 
        node_color='skyblue', 
        node_size=1500, 
        edge_color=df['value'], 
        width=10.0, 
        edge_cmap=plt.cm.Blues)

enter image description here

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