【发布时间】:2019-02-13 03:05:06
【问题描述】:
我使用matplotlib绘制散点图:
并根据matplotlib: how to annotate point on a scatter automatically placed arrow?的提示使用透明框标记气泡
代码如下:
if show_annote:
for i in range(len(x)):
annote_text = annotes[i][0][0] # STK_ID
ax.annotate(annote_text, xy=(x[i], y[i]), xytext=(-10,3),
textcoords='offset points', ha='center', va='bottom',
bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.2),
fontproperties=ANNOTE_FONT)
以及由此产生的情节:
但在减少重叠方面仍有改进的空间(例如标签框偏移固定为(-10,3))。有没有算法可以:
- 根据邻域的拥挤程度动态改变标签框的偏移量
- 远程动态放置标签框并在气泡和标签框之间添加箭头线
- 稍微改变标签方向
- label_box 重叠气泡优于 label_box 重叠 label_box?
我只是想让图表易于人眼理解,所以一些重叠是可以的,而不是像http://en.wikipedia.org/wiki/Automatic_label_placement 建议的那样严格的约束。并且图表中的气泡数量大部分时间都小于 150。
我发现所谓的Force-based label placement http://bl.ocks.org/MoritzStefaner/1377729 很有趣。我不知道是否有任何 python 代码/包可用于实现该算法。
我不是学术人员,也不是在寻找最佳解决方案,而且我的 python 代码需要标记许多图表,因此速度/内存在考虑范围内。
我正在寻找一种快速有效的解决方案。关于这个主题的任何帮助(代码、算法、提示、想法)?谢谢。
【问题讨论】:
-
我打赌你可以用 networkx 和它的布局引擎做一些很酷的事情。
标签: matplotlib label