我刚开始用Python创建图形。我试图使用Python中的graphviz库创建一个简单的逻辑树。
我使用的代码如下
import graphviz
h = graphviz.Digraph(filename = "output/logictree.gv")
#Nodes
#Red boxes
h.attr('node', color='red', shape = "box" )
h.node(name = "a", label = "Emissions Intensity (gCO2/vkm)")
h.node(name = "b", label = 'Load Factor (pkm/vkm)')
h.node(name = "d", label = "Activity per capita (pkm/capita)")
#Blue boxes
h.attr('node', color='blue', shape = "box" )
h.node(name = "c", label = "Emissions Intensity (gCO2/pkm)")
h.node(name = "f", label = "Emissions per capita (gCO2/capita)")
h.node(name = "g", label = "Total Emissions (gCO2)")
#Yellow box
h.attr('node', color='yellow', shape = "box" )
h.node(name = "e", label = "Population")
h.edge("a","c")
h.edge("b","c")
h.edge("c","f")
h.edge("d","f")
h.edge("e","g")
h.edge("f","g")
h.view()
我得到的输出如下所示:
这确实是我想要的输出,然而,我想设置节点的位置,使其水平方向。
我能够使用networkx包设置所需的位置,但我无法获得networkx中不同节点所需的节点属性。从networkx获取图形的代码如下所示:
import networkx as nx
G = nx.DiGraph(filename = "logictree.gv")
G.add_nodes_from([0, 1, 2, 3, 4, 5, 6])
pos = {0:(0,50),
1:(0, 0),
2:(25, 25),
3:(25, -25),
4:(50, 50),
5:(50, 0),
6:(75, 25)}
G.add_edges_from([(0, 2), (1, 2), (2,5), (3,5), (4,6),(5,6)])
labels = {}
labels[0] = "Emissions Intensity\n(gCO2/vkm)"
labels[1] = "Load factor\n (pkm/vkm)"
labels[2] = "Emissions Intensity\n (gCO2/pkm)"
labels[3] = "Activity per capita\n (pkm/capita)"
labels[4] = "Population"
labels[5] = "Emissions per capita\n(gCO2/capita)"
labels[6] = "Total emissions\n(gCO2)"
plt.figure(figsize = (20, 8))
nx.draw_networkx(G, pos = pos, node_shape = "s", labels = labels,
bbox = dict(facecolor = "white"))
图如图所示
如何为使用Python中的graphviz创建的图设置节点的位置或获得类似的方向?
发布于 2022-10-13 19:56:53
正如在另一个答案中提到的,要旋转图形,可以使用属性rankdir
和值LR
。如果需要更改节点的顺序以将Population
节点保持在顶部,则还必须添加带有值in
的属性ordering
。
脚本的一部分:
import graphviz
h = graphviz.Digraph(filename = "output/logictree.gv", format='svg',
graph_attr=dict(rankdir='LR', ordering='in'))
...
结果:
关于NetworkX中所需的位置,您还可以使用Graphviz包将其设置为属性pos
,并将属性engine
设置为neato
(可以处理pos
,与默认的dot
布局引擎不同):
import graphviz
h = graphviz.Digraph(filename = "output/logictree.gv", format='svg',
engine='neato')
h.attr('node', color='red', shape = "box" )
h.node(name = "a", label = "Emissions Intensity (gCO2/vkm)", pos='0,50')
h.node(name = "b", label = 'Load Factor (pkm/vkm)', pos='0,0')
...
发布于 2022-03-23 05:25:10
我相信你想要做的事情是由rankdir属性控制的,你可以把它应用到图表中。它迫使节点布局的方向成为四种选择之一。
考虑到您使用的是networkx库。下面是语法:
G = nx.DiGraph(filename = "logictree.gv")
G.graph['graph']={'rankdir': 'LR'} # apply the preferred rankdir
Graphviz文档:https://graphviz.org/docs/attrs/rankdir/
参考员额:
https://stackoverflow.com/questions/71530231
复制相似问题