选择考虑边缘标签的networkx布局

时间:2019-06-08 12:49:29

标签: networkx graphviz

我正在使用draw_networkx_edge_labels函数绘制networkx加权图。我的问题是,由于边缘有时会彼此交叉,因此从图中并不总是清楚哪个权重属于哪个边缘。例如,在下图中,尚不清楚(2)是(1,2)还是(3,7)的权重。

layout]

我目前正在使用neato布局,该布局未考虑边缘标签。特别是,这就是我绘制加权图<p class="foo" style="color:red"> anything inside component </p> 的方式:

g

我知道我可以使用layout = nx.nx_pydot.graphviz_layout(g, prog='neato') nx.draw(g, pos=layout) edge_labels = nx.get_edge_attributes(g, 'weight') nx.draw_networkx_edge_labels(g, pos=layout, edge_labels=edge_labels) 参数手动控制标签沿边缘的位置,但是我的问题是是否存在一种自动绘制图形的方法,以使边缘标签通常不会发生冲突(使用考虑标签的布局或“巧妙地”选择沿边缘的标签位置的方法。

我并不期望某些东西总是可以工作的,但是由于我的图形相对稀疏,所以我希望至少有一种方法可以很好地工作。

1 个答案:

答案 0 :(得分:0)

一段时间以来,我一直想在netgraph(我的networkx绘图实用程序的分支)中实现此功能。不幸的是,我星期四有工作面试,所以我很快就没有时间写这本书。但是,基本思想非常简单,并且已经在某些ggrepelggnetwork这样的R包中实现了。

基本思想是,在给定节点和边的预定且固定布局的情况下,使用力导向布局来放置标签。所以:

  1. 使用您选择的布局来计算节点布局。

  2. 将每个边缘划分为许多很多节点的链,并使用边缘的源节点和目标节点的已知位置来计算“边缘节点”的位置。这种划分是为了在以下受力引导的布局中为每个边缘提供“质量”。

  3. 为每个边缘添加一个“标签”节点,并将其连接到最中央的“边缘节点”。

  4. 计算力导向的布局,使除标签节点之外的所有节点保持固定(例如,在networkx中使用spring_layout)。

您现在应该具有不与任何边缘重叠的明智的边缘标签坐标。使用plt.annotate绘制边缘和边缘标签之间的连接。