首页 > 解决方案 > Matplotlib 更新 bbox 位置

问题描述

我有一个代码来制作一个自定义饼图,当它检测到它们的 bbox 上存在碰撞时,它会移动注释。我想移动 bbox(以及文本)以避免发短信重叠。我已经检测到了粘连,但是当我使用“set_points”方法时,它并没有更新我的身材。

代码如下:

fig, ax = plt.subplots(figsize=(6, 3), subplot_kw=dict(aspect="equal"))
wedges, texts = ax.pie(
    np.array(values) / sum(values),
    wedgeprops=dict(width=0.5),
    startangle=startAngle,
    colors=color_map,
)
# bbox_props=dict(facecolor='none', edgecolor='none')
bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
kw = dict(arrowprops=dict(arrowstyle="-"), bbox=bbox_props, zorder=0, va="center")
annot_bbox_list = []
for i, p in enumerate(wedges):
    ang = (p.theta2 - p.theta1) / 2.0 + p.theta1
    y = np.sin(np.deg2rad(ang))
    x = np.cos(np.deg2rad(ang))
    horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
    connectionstyle = "angle,angleA=0,angleB={}".format(ang)
    kw["arrowprops"].update({"connectionstyle": connectionstyle})
    actual_annot = ax.annotate(
        labels[i] + f" {values[i]:.1%}",
        xy=(x, y),
        xytext=(1.35 * np.sign(x), 1.4 * y),
        horizontalalignment=horizontalalignment,
        **kw,
    )
    actual_bbox = actual_annot.get_window_extent(renderer=fig.canvas.get_renderer())
    for (annot, bbox)  in annot_bbox_list:
        intersect, move = bbox_intersection(bbox, actual_bbox, margin=10)
        if intersect:
            print(f'{annot.get_text()} e {actual_annot.get_text()} intersectam, movendo a segunda em {move}')
            #fig.canvas.draw()
            points = actual_bbox.get_points()#.copy()
            print('pontos da caixa2 :\n {}'.format(points))
            points[0][1] += move
            points[1][1] += move
            print('pontos novos da caixa2 :\n {}'.format(points))
            renderer=fig.canvas.get_renderer()
            #actual_annot.update_positions(renderer)
            #fig.canvas.draw()
            actual_bbox.set_points(points)
            fig.draw(renderer)
    annot_bbox_list.append((actual_annot, actual_bbox))
    diff += np.sign(x)
dict_angulos[startAngle] = diff

标签: python-3.xmatplotlibannotationspie-chart

解决方案


推荐阅读