python-3.x - 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
解决方案
推荐阅读
- flutter - 我需要知道数据是否已添加到 Cloud Firestore (Flutter)
- javascript - Wordpress JSON Auth API generate_auth_cookie 方法 cookie 值
- java - Java - 通过 json 迭代获取值
- java - 瞬态 json jax-rs
- google-cloud-dataflow - Google Cloud Dataflow 流式传输管道在大约 25 天后挂起
- c++ - 如何在 Qt/hook QPainter 中渲染没有抗锯齿的 SVG 以避免抗锯齿?
- java - 由于 SQL 中的语法错误,Spring Boot 2 测试存储库失败
- c# - 如何从 DataGridTemplateColumn 获取所选项目信息
- excel - 创建和复制新工作表
- python - 使用 http 请求传输二进制数据