如何使用draw_hierarchy实现节点标签向中心径向对齐?
实现draw_hierarchy节点标签径向对齐方案
嘿,我来帮你搞定用draw_hierarchy实现节点标签径向对齐的问题!看起来你用的是graph-tool库,那咱们直接针对这个库来解决问题。核心思路是计算每个节点相对于布局中心的角度,然后让标签旋转到对应角度,实现径向对齐。
第一步:补全你的图构建代码
先把你没写完的图构建逻辑补全,用字典来映射节点名到顶点对象,比列表查找高效多了:
from graph_tool.all import Graph, draw_hierarchy, pos_hierarchy import pandas as pd import math # 读取你的网络数据集(假设每行是两个节点,用空格分隔) data = pd.read_csv("your_network_data.txt", sep=" ", header=None) events = {"e": range(1)} # 你代码里的循环变量,这里保留你的结构 for i in range(len(events["e"])): g = Graph(directed=False) vprop = g.new_vertex_property("string") # 存储节点标签 eprop = g.new_edge_property("int") # 存储边属性(按需设置) added_nodes = {} # 节点名→顶点对象的映射,避免重复添加 n = 0 for ii, row in data.iterrows(): node1, node2 = row[0], row[1] # 添加第一个节点 if node1 not in added_nodes: v = g.add_vertex() vprop[v] = node1 added_nodes[node1] = v n += 1 # 添加第二个节点 if node2 not in added_nodes: v = g.add_vertex() vprop[v] = node2 added_nodes[node2] = v n += 1 # 添加边并设置属性 e = g.add_edge(added_nodes[node1], added_nodes[node2]) eprop[e] = 1 # 这里可以根据你的需求修改边属性值
第二步:计算标签径向对齐的旋转角度
接下来,我们需要为每个节点计算标签的旋转角度,让标签朝向布局中心(或者沿着径向方向,按需调整):
# 获取层级布局的节点位置坐标 pos = pos_hierarchy(g) # 创建顶点属性,存储每个节点标签的旋转角度 text_rot = g.new_vertex_property("double") # 遍历所有节点,计算旋转角度 for v in g.vertices(): x, y = pos[v] # 计算从布局中心到节点的弧度角度 angle_rad = math.atan2(y, x) # 转换为度数,调整角度让标签**朝向中心** # 如果想要标签沿径向垂直排列(类似钟表数字),可以改成 math.degrees(angle_rad) + 90 text_rot[v] = math.degrees(angle_rad) + 180
第三步:绘制带径向对齐标签的层级图
最后调用draw_hierarchy时,把计算好的旋转角度传给text_rotation参数就行:
# 绘制层级图,启用径向对齐的标签 draw_hierarchy( g, pos=pos, vertex_text=vprop, text_rotation=text_rot, vertex_font_size=12, # 按需调整字体大小 edge_pen_width=eprop # 按需设置边宽度 )
关键说明
- 如果希望标签是沿着径向垂直排列(比如像钟表刻度那样,文字和径向方向垂直),把角度计算改成
math.degrees(angle_rad) + 90就行。 pos_hierarchy会自动计算层级布局的节点位置,你也可以直接用draw_hierarchy返回的pos对象,单独计算的好处是可以提前调整布局参数。
内容的提问来源于stack exchange,提问作者Dalek
相关产品推荐
相关产品推荐

