gpt4 book ai didi

python - 显示带有标签的 networkx 图

转载 作者:太空狗 更新时间:2023-10-29 20:12:23 26 4
gpt4 key购买 nike

我正在尝试使用 networkx 创建带标签的图形,但无法正确显示节点和标签。简而言之,标签没有在正确的节点上排列,并且有些节点在显示时没有边。

首先,我创建了一个图,添加了节点和边,然后添加了标签。

图形数据来自具有两列的 pandas DataFrame 对象,员工和经理姓名:

                emp_name             mgr_name
0 Marianne Becker None
1 Evan Abbott Marianne Becker
2 Jay Page Marianne Becker
3 Seth Reese Marianne Becker
4 Maxine Collier Marianne Becker

...

每个节点都是一个名字,边是 mgr_name 到 emp_name 的关系。

我的图代码:

import networkx as nx
G=nx.DiGraph()

#set layout
pos=nx.spring_layout(G)

#add nodes
G.add_nodes_from(df.emp_name)
G.nodes()
G.add_node('None')

#create tuples for edges
subset = df[['mgr_name','emp_name']]
tuples = [tuple(x) for x in subset.values]

#add edges
G.add_edges_from(tuples)
G.number_of_edges()

#draw graph
import matplotlib.pyplot as plt
nx.draw(G, labels = True)
plt.show()

理想情况下,我会有一个树状结构,其中员工姓名作为每个节点的标签。

输出图像是enter image description here

最佳答案

Networkx 具有许多绘制图形的功能,但也允许用户对整个过程进行精细控制。

draw 是基本的,它的文档字符串特别提到:

Draw the graph as a simple representation with no nodeabels or edge labels and using the full Matplotlib figure areas labels by default. See draw_networkx() for more fatured drawing that allows title, axis labels

draw_networkx 为前缀的函数后跟 edgesnodesedge_labelsedge_nodes 允许更好地控制整个绘图过程。

您的示例在使用 draw_networkx 时运行良好。

此外,如果您正在寻找类似于器官图的输出,我建议使用 graphviz通过 networkx。 Graphviz 的 dot 非常适合这种图表(也请 see this 表示 dot)。

在下文中,我尝试稍微修改您的代码以演示这两个函数的用法:

import networkx as nx
import matplotlib.pyplot as plt
import pandas

#Build the dataset
df = pandas.DataFrame({'emp_name':pandas.Series(['Marianne Becker', 'Evan Abbott', 'Jay Page', 'Seth Reese', 'Maxine Collier'], index=[0,1,2,3,4]), 'mgr_name':pandas.Series(['None', 'Marianne Becker', 'Marianne Becker', 'Marianne Becker', 'Marianne Becker'], index = [0,1,2,3,4])})

#Build the graph
G=nx.DiGraph()
G.add_nodes_from(df.emp_name)
G.nodes()
G.add_node('None')
#
#Over here, you are manually adding 'None' but in reality
#your nodes are the unique entries of the concatenated
#columns, i.e. emp_name, mgr_name. You could achieve this by
#doing something like
#
#G.add_nodes_from(list(set(list(D.emp_name.values) + list(D.mgr_name.values))))
#
# Which does exactly that, retrieves the contents of the two columns
#concatenates them and then selects the unique names by turning the
#combined list into a set.

#Add edges
subset = df[['mgr_name','emp_name']]
tuples = [tuple(x) for x in subset.values]
G.add_edges_from(tuples)
G.number_of_edges()

#Perform Graph Drawing
#A star network (sort of)
nx.draw_networkx(G)
plt.show()
t = raw_input()
#A tree network (sort of)
nx.draw_graphviz(G, prog = 'dot')
plt.show()

您也可以通过 nx.write_dot 保存您的 networkx 网络,尝试直接从命令行使用 graphviz 的点。为此:

在你的 python 脚本中:

nx.write_dot(G, 'test.dot')

在此之后,从您的 (linux) 命令行并假设您已经安装了 graphviz:

dot test.dot -Tpng>test_output.png
feh test_output.png #Feh is just an image viewer.
firefox test_output.png & #In case you don't have feh installed.

对于更典型的组织图格式,您可以通过以下方式强制正交边缘路由

dot test.dot -Tpng -Gsplines=ortho>test_output.png

最后,这里是输出

draw_networkx 的输出 Output of <code>draw_networkx</code>

draw_graphviz 的输出 Output of <code>draw_graphviz</code>

没有正交边的的输出 Output of <code>dot</code> without orthogonal edges

输出具有正交边的 Output of <code>dot</code> with orthogonal edges

希望这对您有所帮助。

关于python - 显示带有标签的 networkx 图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29738288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com