【问题标题】:Coloring, weighting and drawing a MultiGraph in networkx?在networkx中着色,加权和绘制MultiGraph?
【发布时间】:2018-06-19 00:24:26
【问题描述】:

This answer 演示了如何使用以下代码绘制具有自定义颜色和边缘粗细的图形:

import networkx as nx

G = nx.Graph()
G.add_edge(1,2,color='r',weight=2)
G.add_edge(2,3,color='b',weight=4)
G.add_edge(3,4,color='g',weight=6)

pos = nx.circular_layout(G)

edges = G.edges()
colors = [G[u][v]['color'] for u,v in edges]
weights = [G[u][v]['weight'] for u,v in edges]

nx.draw(G, pos, edges=edges, edge_color=colors, width=weights)

但是,假设我想绘制一个多图,例如:

G = nx.MultiGraph()
G.add_edge(1,2,color='r',weight=2)
G.add_edge(1,2,color='b',weight=3)
G.add_edge(2,3,color='r',weight=4)
G.add_edge(2,3,color='b',weight=6)

调用 draw 之类的东西总共应该得到三分。点 1 和 2 之间应该有 both 一条红线和蓝线,类似地,2 和 3 之间也应该有 both 一条红线和蓝线。

这不适用于多重图,因为多重边需要不同的存储技术。有没有相对简单的方法解决这个问题?

另外,我相信这question and answer 不适用。提问者使用MultiGraph 对象,但是,实际图不是多重图。解决方案是选择第一个(在他的情况下是唯一的)边缘。但是,在这种情况下,绘制阶段需要两条边。

有没有办法在networkx中绘制具有不同颜色和权重的多条边?

【问题讨论】:

  • 你有正好 2 组边吗?在这种情况下,我个人经常发现网络折线图信息量更大。例如,this.
  • @Paul Atm,我受制于圆形图,但除此之外,是的,你是对的。这个项目看起来确实很有趣!

标签: python networkx


【解决方案1】:

您只需要以不同的方式访问多重图的边缘

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

G = nx.MultiGraph()
G.add_edge(1,2,color='r',weight=8)
G.add_edge(1,2,color='b',weight=3)
G.add_edge(2,3,color='r',weight=4)
G.add_edge(2,3,color='c',weight=6)

pos = nx.circular_layout(G)

edges = G.edges()

colors = []
weight = []

for (u,v,attrib_dict) in list(G.edges.data()):
    colors.append(attrib_dict['color'])
    weight.append(attrib_dict['weight'])


nx.draw(G, pos, edges=edges, edge_color=colors, width=weight, )
plt.show()

这是另一种边的组合

G = nx.MultiGraph()
G.add_edge(1,2,color='r',weight=2)
G.add_edge(1,2,color='b',weight=3)
G.add_edge(2,3,color='r',weight=4)
G.add_edge(2,3,color='b',weight=6)

您可以阅读更多关于访问多重图边的信息here

【讨论】:

    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 2014-05-22
    • 2018-11-25
    • 2013-07-12
    • 2020-06-24
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多