Я использую matplotlib для построения точечной диаграммы:
И пометьте пузырь, используя прозрачную рамку, в соответствии с советом по адресу arrow">matplotlib: как аннотировать точку на автоматически размещенной стрелке разброса?
Вот код:
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 должны маркировать множество диаграмм, поэтому скорость/память находятся в поле зрения.
Я ищу быстрое и эффективное решение. Любая помощь (код, алгоритм, советы, мысли) по этому вопросу? Спасибо.