gpt4 book ai didi

python - 如何改进散点图中的标签放置

转载 作者:行者123 更新时间:2023-12-02 23:02:37 24 4
gpt4 key购买 nike

我使用 matplotlib 绘制散点图:

enter image description here

并根据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)

和结果图: enter image description here

但是在减少重叠方面仍有改进的空间(例如标签框偏移量固定为(-10,3))。是否有算法可以:

  1. 根据邻近区域的拥挤程度动态改变标签框的偏移量
  2. 动态远程放置标签框并在气泡和标签框之间添加箭头线
  3. 稍微改变标签方向
  4. label_box 重叠气泡比 label_box 重叠 label_box 更好?

我只是想让图表易于人眼理解,所以一些重叠是可以的,而不是像 http://en.wikipedia.org/wiki/Automatic_label_placement 那样严格的约束建议。并且图表内的气泡数量大多数时候都小于150个。

我找到了所谓的基于强制的标签放置 http://bl.ocks.org/MoritzStefaner/1377729很有趣。我不知道是否有任何Python代码/包可用于实现该算法。

我不是一个学者,也不是在寻找最佳解决方案,而且我的Python代码需要标记很多图表,所以速度/内存在考虑范围内。

最佳答案

使用我的库adjustText的另一个选项,专门为此目的编写的(https://github.com/Phlya/adjustText)。

from adjustText import adjust_text
np.random.seed(2016)

N = 50
scatter_data = np.random.rand(N, 3)
fig, ax = plt.subplots()
ax.scatter(scatter_data[:, 0], scatter_data[:, 1],
c=scatter_data[:, 2], s=scatter_data[:, 2] * 150)
labels = ['ano_{}'.format(i) for i in range(N)]
texts = []
for x, y, text in zip(scatter_data[:, 0], scatter_data[:, 1], labels):
texts.append(ax.text(x, y, text))
plt.show()

enter image description here

np.random.seed(2016)

N = 50
scatter_data = np.random.rand(N, 3)
fig, ax = plt.subplots()
ax.scatter(scatter_data[:, 0], scatter_data[:, 1],
c=scatter_data[:, 2], s=scatter_data[:, 2] * 150)
labels = ['ano_{}'.format(i) for i in range(N)]
texts = []
for x, y, text in zip(scatter_data[:, 0], scatter_data[:, 1], labels):
texts.append(ax.text(x, y, text))
adjust_text(texts, force_text=0.05, arrowprops=dict(arrowstyle="-|>",
color='r', alpha=0.5))
plt.show()

enter image description here

它不会排斥气泡,只会排斥气泡的中心和其他文本。

关于python - 如何改进散点图中的标签放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14938541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com