首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python: networkx:如何使节点大小自动展开以适应标签

Python: networkx:如何使节点大小自动展开以适应标签
EN

Stack Overflow用户
提问于 2015-01-10 17:04:53
回答 4查看 7.2K关注 0票数 6

我正在使用deap符号回归示例中的代码,图形显示得很好,但我希望节点作为圆角矩形展开,以适应文本automatically.(我不想通过尝试和错误来指定节点大小)。我该怎么做?

代码语言:javascript
运行
复制
# show tree
import matplotlib.pyplot as plt
import networkx

nodes, edges, labels = gp.graph(bests[0])
graph = networkx.Graph()
graph.add_nodes_from(nodes)
graph.add_edges_from(edges)
pos = networkx.graphviz_layout(graph, prog="dot")

plt.figure(figsize=(7,7))
networkx.draw_networkx_nodes(graph, pos, node_size=900, node_color="w")
networkx.draw_networkx_edges(graph, pos)
networkx.draw_networkx_labels(graph, pos, labels)
plt.axis("off")
plt.show()
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-01-10 17:20:15

使用matplotlib和networkx没有一种简单的方法可以做到这一点(当然,有足够的代码是可能的)。Graphviz在标签方面做得非常出色,从networkx到Graphviz处理点格式文件很容易。

还可以看一看https://github.com/chebee7i/nxpd,它可以完全满足您的需要。

票数 1
EN

Stack Overflow用户

发布于 2015-09-05 23:50:23

参数node_size同时接受标量值和向量值。虽然标量使所有节点大小相等,但向量可以帮助您在列表中为每个节点指定单独的值。如果节点ids是字符串,那么下面的策略工作得很好。

只需根据每个节点id的长度将size参数更改为networkx.draw_networkx_nodes中的列表即可。适当选择the_base_size

代码语言:javascript
运行
复制
networkx.draw_networkx_nodes(graph, pos, 
    node_size=[len(v) * the_base_size for v in graph.nodes()], 
    node_color="w")

您也可以根据处理标签的情况对此进行调整。

*然而,我不确定当它根据标签大小从列表中选择节点大小时,是否会保留一对一的通信。分享你的成果。我亲自将它用于字符串节点it,并且运行良好。

票数 5
EN

Stack Overflow用户

发布于 2021-04-08 07:37:19

我喜欢@mathfux的解决方案,因为它在有向图中正确地定位了箭头。但是它需要一些调整来解决所提到的对应问题(位置和颜色列表是按布局顺序排列的,而不是节点顺序);也需要处理基于零的列表索引。我还发现,尺寸是按平方定律工作的,而不是线性的。这里有一个改进的颜色版本,使用Kamada葵而不是Spring,这样布局就不会每次都改变。

代码语言:javascript
运行
复制
import pandas as pd
import matplotlib.pyplot as plt
import networkx as nx

G = nx.DiGraph()
G.add_edges_from([(0,1), (1, 1), (1, 7), (2, 1), (2, 2), (2, 3), 
                  (2, 6), (3, 5), (4, 3), (5, 4), (5, 8),
                  (5, 9), (6, 4), (7, 2), (7, 6), (8, 7)])
labelList="zero one twotwotwo three four five six seven eighteighteight nine".split(' ')

positions=nx.kamada_kawai_layout(G)
plt.figure(figsize =(9, 9))
nx.draw_networkx(G, 
                 node_color =['C{}'.format(i) for i in positions], 
                 pos=positions, 
                labels={idx: val for idx, val in enumerate(labelList)},
                node_size=[len(labelList[i])**2 * 60 for i in positions]
                )

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

https://stackoverflow.com/questions/27878794

复制
相关文章

相似问题

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