如何修改networkx的Digraph中的边标签

How to modify edge labels in Digraph of networkx

我正在使用 matplotlib 和 graphviz 绘制图表。工作正常,但我想去掉边缘的标签文本。

输出:

我只想在没有任何额外标签的情况下显示权重(边缘上的那些数字)。它们有时是不可读的。 我尝试了多种技巧,但无法删除它们。

代码:

import networkx as nx
from networkx.drawing.nx_agraph import write_dot, graphviz_layout
from matplotlib import pyplot as plt

my_graph = nx.DiGraph()
my_graph.add_weighted_edges_from([("single1", "double1", 0), ("double1", "single2", 0), ("double1", "double3", 2), ("single2", "double3", 0), (
    "double2", "double4", 1), ("double2", "double5", 3), ("double3", "double5", 2), ("double4", "double6", 1), ("double4", "double6", 4)])


write_dot(my_graph, "graph.dot")

plt.title("draw graph")
pos = graphviz_layout(my_graph, prog='dot')
# labels = nx.get_edge_attributes(my_graph, 'w')


# nx.draw_networkx_edge_labels(my_graph, pos, labels=labels)
nx.draw_networkx_edge_labels(my_graph, pos)

nx.draw(my_graph, pos, with_labels=False, arrows=True)
nx.draw_networkx_edges(my_graph, pos)


plt.show()
plt.clf()

注释代码是我尝试过的,至少可以缩短标签文本,但它根本不会影响图表。

要求输出:

A similar graph with only weights(numbers) visible on edges. Or at-least with shorter edge labels.

我还没有使用过 pygraphviz,但我希望这个通用解决方案对您有用。

networkx 包允许以多种方式查找边缘属性,例如:

  • my_graph.edges.data() - 包含边属性字典的元组列表
  • my_graph.edges.data('weight') - 包含特定属性值的元组列表
  • nx.get_edge_attributes(my_graph,'weight') - 与之前类似,采用字典形式。

draw_networkx_edge_labels的文档列出了所有的参数,其中之一是:

edge_labels (dictionary) - Edge labels in a dictionary keyed by edge two-tuple of text labels (default=None). Only labels for the keys in the dictionary are drawn.

我认为此时应该输入哪种形式并不难猜。使用:

nx.draw_networkx_edge_labels(my_graph, pos, edge_labels = nx.get_edge_attributes(my_graph,'weight'))

所以,毕竟,我认为你们非常接近:)