首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何设置节点的位置或获得所需的方向来使用Python中的graphviz绘制图形?

如何设置节点的位置或获得所需的方向来使用Python中的graphviz绘制图形?
EN

Stack Overflow用户
提问于 2022-03-18 16:27:21
回答 2查看 214关注 0票数 0

我刚开始用Python创建图形。我试图使用Python中的graphviz库创建一个简单的逻辑树。

我使用的代码如下

代码语言:javascript
运行
复制
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获取图形的代码如下所示:

代码语言:javascript
运行
复制
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创建的图设置节点的位置或获得类似的方向?

EN

回答 2

Stack Overflow用户

发布于 2022-10-13 19:56:53

正如在另一个答案中提到的,要旋转图形,可以使用属性rankdir和值LR。如果需要更改节点的顺序以将Population节点保持在顶部,则还必须添加带有值in的属性ordering

脚本的一部分:

代码语言:javascript
运行
复制
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 布局引擎不同):

代码语言:javascript
运行
复制
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')
...
票数 1
EN

Stack Overflow用户

发布于 2022-03-23 05:25:10

我相信你想要做的事情是由rankdir属性控制的,你可以把它应用到图表中。它迫使节点布局的方向成为四种选择之一。

  • TB (自上而下;默认)
  • BT (从下到上)
  • (从左到右) <--我相信这是你想要的
  • RL (右向左)

考虑到您使用的是networkx库。下面是语法:

代码语言:javascript
运行
复制
G = nx.DiGraph(filename = "logictree.gv")
G.graph['graph']={'rankdir': 'LR'}  # apply the preferred rankdir

Graphviz文档:https://graphviz.org/docs/attrs/rankdir/

参考员额:

如何在最终的点输出中添加点的图形属性

如何从左到右画树

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71530231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档