【问题标题】:NetworkX multigraph plot does not show labelsNetworkX 多重图不显示标签
【发布时间】:2022-05-06 19:41:52
【问题描述】:

我正在尝试使用 Python 绘制知识图,查看了许多示例和答案,但仍然无法从边缘列表中自动绘制边缘标签。这是我正在尝试做的一个简化的工作示例:

import pandas as pd
import networkx as nx
minidf = pd.DataFrame(data={'relation': ['subject', 'subject', 'broader'], 
                       'source': ['pmt3423', 'pmt2040', 'category:myoblasts'], 
                       'target': ['conceito', 'frio', 'category:non-terminally_differentiated_(blast)']})
miniG = nx.from_pandas_edgelist(minidf,'source', 'target',
                      edge_key='relation', create_using=nx.MultiDiGraph())
nx.draw_networkx(miniG, with_labels=True)

我得到的输出如下:

我也尝试过 draw_circular 等。我也尝试过使用 pyvis 并生成一个点文件 + 使用neato 转换为 png。还没有完全明白。 任何帮助表示赞赏。

【问题讨论】:

  • 你检查过这个问题吗:stackoverflow.com/questions/32905262/…nx.draw_networkx_edge_labels 似乎不支持 MultiGraphs。
  • 是的。我已经尝试过了,但它仍然无法正常工作。不知何故,我的图表似乎不受支持。此外,当我使用 edge_attr=True、列关系甚至列表 ['relation'] 创建图形时,它会运行,但在将属性添加到边时没有效果。但是感谢@Sparky05,我想我现在会放弃这个可视化。
  • 我刚刚看到在您给定的示例中,创建的图中没有边属性。不确定这是否是您的最小示例(顺便说一句非常有用)或您的一般代码中的错误,请查看from_pandas_edgelist 中的示例。如果我正确理解文档,则您需要多图 edge_keyedge_column

标签: python graph networkx graph-visualization knowledge-graph


【解决方案1】:

以下是向图表添加边标签的方法:

import pandas as pd
import networkx as nx
from matplotlib import pyplot as plt

minidf = pd.DataFrame(data = {'relation': ['subject', 'subject', 'broader'],
                       'source': ['pmt3423', 'pmt2040', 'category:myoblasts'],
                       'target': ['conceito', 'frio', 'category:non-terminally_differentiated_(blast)']})

miniG = nx.from_pandas_edgelist(minidf,'source', 'target', create_using=nx.MultiDiGraph())

pos = nx.spring_layout(miniG)
e_labels = {(minidf.source[i], minidf.target[i]):minidf.relation[i]
          for i in range(len(minidf['relation']))}

nx.draw_networkx_edge_labels(miniG, pos, edge_labels= e_labels)
nx.draw(miniG, pos = pos,with_labels=True)
plt.show()

但是,正如您在上面看到的,这可能会很混乱,因为您的图表中没有太多空间可以放置边标签。更好的解决方案是对边缘进行颜色编码并提供图例:

import pandas as pd
import networkx as nx
from matplotlib import pyplot as plt

minidf = pd.DataFrame(data = {'relation': ['subject', 'subject', 'broader'],
                       'source': ['pmt3423', 'pmt2040', 'category:myoblasts'],
                       'target': ['conceito', 'frio', 'category:non-terminally_differentiated_(blast)']})

miniG = nx.from_pandas_edgelist(minidf,'source', 'target', create_using=nx.MultiDiGraph())

#color-code the edges
color_code = {'subject':'red', 'broader':'lime'}
edge_color_list = [color_code[rel] for rel in minidf.relation]
nx.draw(miniG, with_labels= True, edge_color= edge_color_list)

#create a color-coded legend
leg = plt.legend(color_code,labelcolor=color_code.values())
for i, item in enumerate(leg.legendHandles):
    item.set_color(list(color_code.values())[i])

plt.show()

【讨论】:

  • 太棒了!很好的解决方案,很好的回复。非常感谢你,@pakpe!!!
猜你喜欢
  • 2014-11-10
  • 2016-06-08
  • 2021-02-16
  • 2019-07-13
  • 1970-01-01
  • 2021-11-11
  • 2023-03-03
  • 1970-01-01
  • 2018-01-20
相关资源
最近更新 更多