我正在使用draw_networkx_edge_labels函数绘制networkx加权图。我的问题是,由于边缘有时会彼此交叉,因此从图中并不总是清楚哪个权重属于哪个边缘。例如,在下图中,尚不清楚(2)是(1,2)还是(3,7)的权重。
我目前正在使用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)
参数手动控制标签沿边缘的位置,但是我的问题是是否存在一种自动绘制图形的方法,以使边缘标签通常不会发生冲突(使用考虑标签的布局或“巧妙地”选择沿边缘的标签位置的方法。
我并不期望某些东西总是可以工作的,但是由于我的图形相对稀疏,所以我希望至少有一种方法可以很好地工作。
答案 0 :(得分:0)
一段时间以来,我一直想在netgraph(我的networkx绘图实用程序的分支)中实现此功能。不幸的是,我星期四有工作面试,所以我很快就没有时间写这本书。但是,基本思想非常简单,并且已经在某些ggrepel
和ggnetwork
这样的R包中实现了。
基本思想是,在给定节点和边的预定且固定布局的情况下,使用力导向布局来放置标签。所以:
使用您选择的布局来计算节点布局。
将每个边缘划分为许多很多节点的链,并使用边缘的源节点和目标节点的已知位置来计算“边缘节点”的位置。这种划分是为了在以下受力引导的布局中为每个边缘提供“质量”。
为每个边缘添加一个“标签”节点,并将其连接到最中央的“边缘节点”。
计算力导向的布局,使除标签节点之外的所有节点保持固定(例如,在networkx中使用spring_layout
)。
您现在应该具有不与任何边缘重叠的明智的边缘标签坐标。使用plt.annotate
绘制边缘和边缘标签之间的连接。