Динамическое положение объектов ggplot2 (особенно geom_text)?

При использовании ArcGIS для создания карт программное обеспечение по умолчанию автоматически нажимает метки точек и многоугольников, чтобы избежать совпадения с использованием запатентованного алгоритма. Они ссылаются на это как динамическая маркировка. ggplot2 имеет position_jitter, который отлично подходит для точек (поскольку динамическая маркировка может создавать систематическое смещение), но менее подходит для меток с использованием geom_text.

Вот пример некоторых проблем с дрожанием, которые может решить алгоритм динамической маркировки:

library(ggplot2)
ggplot( mtcars,aes( x=wt, y=mpg, label=rownames(mtcars) ) ) +
  geom_point() +
  geom_text( position=position_jitter(h=1,w=1) )

jittered labels with problems noted

Есть ли такая функция динамической маркировки уже в ggplot2?

Если нет, какие алгоритмы существуют для этого и возможно ли реализовать position_dynamic в R?

Ответ 1

Проверьте новый пакет ggrepel. ggrepel предоставляет геометрии для ggplot2, чтобы отражать перекрывающиеся текстовые метки. Он работает как для geom_text, так и для geom_label.

введите описание изображения здесь

Рисунок взято из этого сообщения в блоге.

Ответ 2

У меня возникла аналогичная проблема с некоторыми из графиков, с которыми я работал, и написал базовый пакет, который использует силовое симуляцию для настройки местоположения объекта. Несмотря на то, что возможны значительные улучшения, включая интеграцию с ggplot и т.д., Похоже, что эта задача выполнена. Ниже приведены функциональные возможности:

install.packages("FField", type = "source")
install.packages("ggplot2")
install.packages("gridExtra")
library(FField)
FFieldPtRepDemo()

Ответ 3

AFAIK, лучшее, что существует, directlabels, доступно из R-forge и CRAN и с помощью всеобъемлющей страницы примеров.

Это кажется хорошей отправной точкой, но, на мой взгляд, имеет следующие негативные аспекты:

  • В отличие от ggplot философии разделения данных и представления, directlabels возвращает объект ggplot, а не geom
  • он работает только с group эстетическими, а не отдельными точками.

Я взглянул на исходный код некоторое время назад, и я думаю, что было бы разумно легко адаптировать код для решения обеих проблем, о которых я упоминаю.

Есть пример того, как использовать это с ggplot в этот вопрос на SO

Ответ 4

Это не что-то, что можно использовать непосредственно в ggplot2, но функция ordipointlabel() в пакете vegan пытается сделать что-то подобное. Он отображает данные как точки и пытается маркировать каждую точку соответствующей меткой, используя алгоритм оптимизации, чтобы расположить метки рядом с их точкой, но не перекрывая другие метки и точки.

?ordipointlabel упоминает, что он основан на pointlabel() в пакете maptools, который может быть другим местом для поиска вдохновения.