【问题标题】:NetworkX does not show edge label for edge to the same nodeNetworkX 不显示同一节点的边缘标签
【发布时间】:2021-12-30 23:07:18
【问题描述】:

我发现 NetworkX 图形绘制库有一个奇怪的行为:如果边向后指向同一个节点,它不会绘制边标签。

我很确定它是 NetworkX 的一项功能,因为我使用相同的方法创建所有边缘标签,并且它适用于非循环边缘,正如您在图像中看到的那样。

是否有任何显示选项可以帮助显示所有边缘标签?

import networkx as nx
import matplotlib.pyplot as plt

g = nx.DiGraph()

edge_labels = dict()

g.add_edge(0, 1 )
#ATTENTION - this will work
edge_labels[(0, 1)] = '01'

g.add_edge(0, 0)

#ATTENTION - this line will not work
edge_labels[(0, 0)] = '00'

pos = nx.spring_layout(g)
nx.draw(g, pos, with_labels=True, font_weight='bold')
nx.draw_networkx_edge_labels(g, pos, edge_labels=edge_labels, 
font_color='red')
plt.show()

已解决 通过将 '_____' 放在循环边缘的字符串之前,您可以看到它。 不漂亮,但显示

        if state_id == self.last_parent.id:#if it is loop
        self.edge_labels[(self.last_parent.id, state_id)] = '_____'+ char_of_edge# add to the edge label the symbols

例子:

【问题讨论】:

  • 你能用代码创建一个小样本吗?
  • 检查一下。 edge_labels[(0, 0)] = '00' 不工作
  • 嘿,您找到了解决方法真是太棒了——您能否将其发布为答案而不是将其编辑到您的问题中?

标签: python networkx


【解决方案1】:

给定两个节点 (x1, y1)(x2, y2) 的坐标,标签位置计算为

(x, y) = (
            x1 * label_pos + x2 * (1.0 - label_pos),
            y1 * label_pos + y2 * (1.0 - label_pos),
        )

其中label_pos 的默认值为0.5 [source]
这意味着自边缘的边缘标签与节点位置重叠,这就是为什么你看不到它,除非增加字体大小。

【讨论】:

  • 我能以某种方式改变这个位置或扩展这个代码吗?
猜你喜欢
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 2021-11-11
  • 2016-03-08
  • 2023-04-05
  • 2021-01-02
相关资源
最近更新 更多