graph_tool使用add_edge_list导入边数据后如何设置顶点文本标签
解决方案
你现有代码返回的vmap已经包含了所有顶点和原始文本名称的映射关系,不需要手动处理节点添加顺序,也不需要提前手动添加顶点,直接用这个映射即可设置顶点标签:
from graph_tool.all import * g = Graph() eweight = g.new_ep('double') # 返回的vmap是VertexPropertyMap类型,每个顶点对应的属性值就是原始的文本节点名 vmap = g.add_edge_list(df.values, eprops=[eweight], hashed=True) # 绘图时直接指定vertex_text为vmap即可显示文本标签,也可以单独存为label属性方便后续调用 graph_draw(g, vertex_text=vmap, vertex_font_size=12, edge_pen_width=eweight, # 用权重设置边粗细,不需要可以删掉 output="network.png")
疑问解答
1. 是否需要先手动添加所有顶点再导入边?
不需要。hashed=True时add_edge_list会自动对所有出现的源/目标节点去重,依次添加为新顶点,返回的vmap已经自动完成了顶点对象和原始文本ID的映射,不需要你自行匹配顺序。
只有当你需要提前给部分顶点设置自定义属性、或者要保留指定的顶点排序时,才需要提前手动添加顶点。
2. 导入边时能否正确识别已有的顶点名称标签?
可以。hashed参数除了布尔值外,还支持直接传入提前创建好的存储节点名称的顶点属性,add_edge_list会自动用这个属性的值匹配已有顶点,不会重复创建:
g = Graph() # 提前创建存储节点名称的顶点属性 vname = g.new_vp('string') # 从数据框中提取去重后的所有节点列表 node_list = pd.unique(pd.concat([df['id_source'], df['id_target']])) for name in node_list: v = g.add_vertex() vname[v] = name # 导入边时传入vname作为哈希匹配依据,会自动匹配已有顶点 eweight = g.new_ep('double') g.add_edge_list(df.values, eprops=[eweight], hashed=vname)
内容的提问来源于stack exchange,提问作者EFL
相关产品推荐
相关产品推荐

