在networkx中绘制有向图,属性给出图中的高度

问题描述 投票:0回答:1

networkx
中,我有一个有向图
G = networkx.DiGraph()
,其中每个节点都有一个属性
w
(始终是正整数,包括零)。该图是非循环的(它表示偏序集),并且值随着从一个节点到另一个节点而增加,也就是说,如果
G.nodes[n1]["w"] < G.nodes[n2]["w"]
n1
之间存在路径,但它不是直接路径,则一般为
n2
图中位置的函数,即与同一节点有边的两个节点可以具有不同的
w
值,只要它们大于其原点即可。

我需要将此图绘制为

tikz
中的
latex
图。我希望该图不仅代表
G
,而且还代表具有不同
w
值的节点位于不同的高度(以及相同高度的
w
相同值。

我实现的一个玩具示例是:

import networkx
import dot2tex


nodes = [
    ["A", {"w": 0}],
    ["B", {"w": 1}],
    ["C", {"w": 2}],
    ["D", {"w": 3}],
        ]

edges = [
    ["A", "B"],
    ["A", "C"],
    ["B", "D"],
    ["C", "D"],
]

G = networkx.DiGraph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)
    
A = networkx.nx_agraph.to_agraph(G)
dot_string = A.string()

latex_string = dot2tex.dot2tex(
    dot_string,
    preproc=True,
    docpreamble=r"\usepackage{amsmath,amssymb,amsthm,bm}",
    format="tikz"
)
latex_string = dot2tex.dot2tex(
    latex_string,
    figonly=False,
    docpreamble=r"\usepackage{amsmath,amssymb,amsthm,bm}",
    autosize=True,
    crop=True,
    valignmode="dot",
    format="tikz"
)

print(latex_string)

with open("test.tex", "w") as f:
    f.write(latex_string)

这给出了左边的图片

enter image description hereenter image description here

但是,我需要节点

C
位于
B
D
之间,以反映其参数
w=2
满足
1<2<3
的事实,如右图所示。我的实际图表可以有 50 个节点,因此手动完成需要很长时间。有没有一种简单的方法可以自动完成?精确的高度并不重要,只要清楚
B
C
具有不同的
w
即可。

latex networkx dot
1个回答
0
投票

正如 @sroush 所评论的,这是通过将

minlen
属性设置为
w
图的每个
dot
值之间的差来实现的。最简单的就是直接在
networkx.DiGraph
级别进行。

只需在上面的代码中添加以下位线即可得到所需的结果

...
G = networkx.DiGraph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)

for e in G.edges:
    G.edges[e]["minlen"] = G.nodes[e[1]]["w"] - G.nodes[e[0]]["w"]
...

resulting figure after adding bit of code

© www.soinside.com 2019 - 2024. All rights reserved.