在
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)
这给出了左边的图片
但是,我需要节点
C
位于 B
和 D
之间,以反映其参数 w=2
满足 1<2<3
的事实,如右图所示。我的实际图表可以有 50 个节点,因此手动完成需要很长时间。有没有一种简单的方法可以自动完成?精确的高度并不重要,只要清楚 B
和 C
具有不同的 w
即可。