根据graphviz_layout

时间:2019-03-10 03:22:09

标签: python networkx graphviz

我正在尝试使用networkx绘制加权图。我正在使用graphviz_layout生成顶点的位置。我希望图中的边缘长度与我使用的边缘权重成比例。以下是我的代码段以实现此目的:

import networkx as nx
from networkx.drawing.nx_agraph import graphviz_layout

G = nx.graph()
G.add_weighted_edges_from(edgelist)
pos = graphviz_layout(G)
nx.draw_networkx(G, pos=pos)

这似乎不会影响图中的边长。我见过this post,但是它仅描述了如何将所有边缘的单个默认权重传递给graphviz_layout(或者也许我不了解解决方案)。

如何更改代码段以绘制长度与边缘权重成比例的图形?

在上面的代码段中,edgelist是这种格式的列表的列表:

edgelist = [[4, 219, 1.414], [4, 7, 3.86]]

谢谢。

1 个答案:

答案 0 :(得分:0)

关键是要设置边缘的len属性,如Graphviz docs中所述(可用于Neato)。请注意,这是首选的边长,因此您将无法完全控制。例如,您可以向图(u, v, w)添加单个加权边G,如下所示:

G.add_edge(u, v, len=w)

以下是使用Florentine families graph的完整示例:

# Load modules
import networkx as nx
from networkx.drawing.nx_agraph import graphviz_layout
import matplotlib.pyplot as plt

# Construct the graph, choosing some edges to be longer
G = nx.generators.social.florentine_families_graph()
lengths = dict()
long_edges = { frozenset(['Salviati', 'Pazzi']),
               frozenset(['Ginori', 'Albizzi']) }
for edge in G.edges():
    if frozenset(edge) in long_edges:
        lengths[edge] = dict(len=2)
    else:
        lengths[edge] = dict(len=1)

nx.set_edge_attributes(G, lengths)

# Plot and show
pos = graphviz_layout(G, prog='neato')
nx.draw_networkx(G, pos=pos)

plt.tight_layout()
plt.show()

为说明使用边缘长度时布局的差异,这是将一级节点(“ Ginori”和“ Pazzi”)的两个边缘设置得更长的结果: Florentine with some longer edges

以下是使用任何边缘长度的结果 不是 Florentine with all edges lengths the same