嗨。我有一个圆形布局图,布局外有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个节点的每个(直)边制作一个贝塞尔路径(或类似于贝塞尔),它将保持在圆形布局中的节点之外,直到到达圆形布局的目标节点,通过螺旋(我不希望边从图形中跳出来,就像当你增加边的中点时发生的那样)。
目前,我只有贝塞尔曲线数学计算出的内部圆形布局边缘:
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:
# midpoint of the edge
x_mid = 0 * (x_u + x_v)
y_mid = 0 * (y_u + y_v)
# control point for 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 curve path
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)
1条答案
按热度按时间vmpqdwk31#
此解决方案在绕中心原点布线的两个点之间创建样条曲线。对于每个样条曲线,其内部点到原点的距离在样条曲线的起点和终点到同一原点的距离之间插值,从而产生类似螺旋的外观。
此解决方案还选择围绕原点的最短路径(而不是总是逆时针环绕)。