如何将Graphviz节点位置归一化至从(0,0)开始按单位递增?
调整NetworkX节点坐标为单位递增形式
可以实现,以下是具体的处理步骤:
提取原始坐标并分离坐标轴
先从original_pos中提取所有节点的x、y坐标值:# 提取所有x和y坐标 xs = [pos[0] for pos in original_pos.values()] ys = [pos[1] for pos in original_pos.values()]归一化到从0开始的基准
计算x和y的最小值,将所有坐标平移,让最小的x和y变为0:min_x = min(xs) min_y = min(ys) # 平移坐标,使最小值为0 shifted_pos = {node: (x - min_x, y - min_y) for node, (x, y) in original_pos.items()}映射为单位递增的整数坐标
如果需要让坐标严格按单位递增(即坐标值为连续整数,步长1),可以对平移后的坐标进行排序,然后重新分配索引:# 对x坐标去重排序,建立映射关系 unique_x = sorted(list(set([pos[0] for pos in shifted_pos.values()]))) x_map = {x: idx for idx, x in enumerate(unique_x)} # 对y坐标去重排序,建立映射关系 unique_y = sorted(list(set([pos[1] for pos in shifted_pos.values()]))) y_map = {y: idx for idx, y in enumerate(unique_y)} # 生成最终单位递增的坐标 final_pos = {node: (x_map[x], y_map[y]) for node, (x, y) in shifted_pos.items()}
这样处理后,节点的x和y坐标都会从0开始,以1为步长递增,同时保留了原始布局的相对位置关系(比如原本在同一列的节点依然会在同一列,同一行的依然在同一行)。
注意:如果原始布局中存在非均匀的坐标间隔,这种方法会将间隔压缩为单位长度,仅保留节点的相对层级和位置关系。
内容的提问来源于stack exchange,提问作者Harsh Shah
相关产品推荐
相关产品推荐

