Ответ 1
Проверьте новый пакет ggrepel. ggrepel предоставляет геометрии для ggplot2, чтобы отражать перекрывающиеся текстовые метки. Он работает как для geom_text, так и для geom_label.
Рисунок взято из этого сообщения в блоге.
При использовании 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) )
Есть ли такая функция динамической маркировки уже в ggplot2?
Если нет, какие алгоритмы существуют для этого и возможно ли реализовать position_dynamic
в R?
Проверьте новый пакет ggrepel. ggrepel предоставляет геометрии для ggplot2, чтобы отражать перекрывающиеся текстовые метки. Он работает как для geom_text, так и для geom_label.
Рисунок взято из этого сообщения в блоге.
У меня возникла аналогичная проблема с некоторыми из графиков, с которыми я работал, и написал базовый пакет, который использует силовое симуляцию для настройки местоположения объекта. Несмотря на то, что возможны значительные улучшения, включая интеграцию с ggplot и т.д., Похоже, что эта задача выполнена. Ниже приведены функциональные возможности:
install.packages("FField", type = "source")
install.packages("ggplot2")
install.packages("gridExtra")
library(FField)
FFieldPtRepDemo()
AFAIK, лучшее, что существует, directlabels
, доступно из R-forge и CRAN и с помощью всеобъемлющей страницы примеров.
Это кажется хорошей отправной точкой, но, на мой взгляд, имеет следующие негативные аспекты:
ggplot
философии разделения данных и представления, directlabels
возвращает объект ggplot, а не geomgroup
эстетическими, а не отдельными точками.Я взглянул на исходный код некоторое время назад, и я думаю, что было бы разумно легко адаптировать код для решения обеих проблем, о которых я упоминаю.
Есть пример того, как использовать это с ggplot
в этот вопрос на SO
Это не что-то, что можно использовать непосредственно в ggplot2, но функция ordipointlabel()
в пакете vegan пытается сделать что-то подобное. Он отображает данные как точки и пытается маркировать каждую точку соответствующей меткой, используя алгоритм оптимизации, чтобы расположить метки рядом с их точкой, но не перекрывая другие метки и точки.
?ordipointlabel
упоминает, что он основан на pointlabel()
в пакете maptools, который может быть другим местом для поиска вдохновения.