环形布局外节点的螺旋Bezier路径实现需求
实现环形布局外侧节点的螺旋式Bezier曲线路径
Networkx环形布局(双层环)示意图
需求背景
我有一个环形布局图,按设计要求有12个节点位于布局外侧,外侧节点的布局代码如下:
num_miR_nodes = len(miR_nodes['nodes']) angle_increment = 2*math.pi / num_miR_nodes miR_radius = 1.5 for i, node in enumerate(miR_nodes['nodes']): angle = i * angle_increment x = miR_radius * math.cos(angle) y = miR_radius * math.sin(angle) pos[node] = (x, y) G.add_node(node)
我需要为这12个外侧节点的每条直边创建Bezier路径(或类Bezier曲线),要求曲线以螺旋向内的方式延伸,在到达目标节点前始终处于布局节点外侧,避免边因过度调整中点而偏离图结构。
现有实现
目前仅完成了环形布局内侧边的Bezier曲线实现,代码如下:
def draw_curved_edges2(G, pos, ax, alpha): for u, v, d in G.edges(data=True): edge_color = d['edge_color'] weight = d['width'] pos_u = pos[u] pos_v = pos[v] x_u, y_u = pos_u x_v, y_v = pos_v if 'miR' not in u: # 边的中点 x_mid = 0 * (x_u + x_v) y_mid = 0 * (y_u + y_v) # Bezier控制点 x_ctrl = 0.25 * (x_mid + 0.5 * (x_u + x_v)) y_ctrl = 0.25 * (y_mid + 0.5 * (y_u + y_v)) # Bezier曲线路径 bezier_path = Path([(x_u, y_u), (x_ctrl, y_ctrl), (x_v, y_v)], [Path.MOVETO, Path.CURVE3, Path.CURVE3]) width = G[u][v]['width']# for u, v in G.edges()] #patch = PathPatch(bezier_path, facecolor='none', edgecolor=edge_color, linewidth=width, alpha=alpha) #ax.add_patch(patch) arrow = FancyArrowPatch(path=bezier_path, color=edge_color, linewidth=width, alpha=alpha, arrowstyle="->, head_length=6, head_width=2, widthA=1.0, widthB=1.0, lengthA=0.4, lengthB=0.4") ax.add_patch(arrow) draw_curved_edges2(G, pos, ax, alpha=0.4)
内容的提问来源于stack exchange,提问作者Austin Kunch
相关产品推荐
相关产品推荐

