Posición dinámica para objetos ggplot2(especialmente geom_text)?
(4)
Cuando se utiliza ArcGIS para hacer mapas, el software empuja las etiquetas de puntos y polígonos de forma automática para evitar que se superpongan utilizando un algoritmo patentado. Se refieren a esto como etiquetado dinámico . ggplot2
tiene position_jitter
que es excelente para los puntos (ya que el etiquetado dinámico puede crear un sesgo sistemático), pero menos bueno para las etiquetas que usan geom_text
.
Aquí hay un ejemplo de algunos problemas con el jitter que un algoritmo de etiquetado dinámico podría resolver:
library(ggplot2)
ggplot( mtcars,aes( x=wt, y=mpg, label=rownames(mtcars) ) ) +
geom_point() +
geom_text( position=position_jitter(h=1,w=1) )
¿Existe ya una característica de etiquetado dinámico en ggplot2?
Si no, ¿qué algoritmos existen para hacerlo y es posible implementar una position_dynamic
en R?
AFAIK, lo mejor que existe es directlabels
, disponible en R-forge y CRAN y con una página de ejemplos completa.
Esto parece un buen punto de partida, pero en mi opinión tiene los siguientes aspectos negativos:
- A diferencia de la filosofía
ggplot
de separar datos y presentación,directlabels
devuelve un objeto ggplot en lugar de un geom - Solo funciona en el
group
estético, no puntos individuales.
He echado un vistazo al código fuente hace algún tiempo y creo que debería ser razonablemente fácil adaptar el código para abordar los dos puntos que menciono.
Hay un ejemplo de cómo usar esto con ggplot
en esta pregunta en SO
Esto no es algo que pueda usarse directamente en ggplot2 , pero la función ordipointlabel()
en el paquete vegan intenta hacer algo similar. Muestra los datos como puntos e intenta etiquetar cada punto con la etiqueta adecuada, utilizando un algoritmo de optimización para colocar las etiquetas junto a su punto, pero sin superponer otras etiquetas y puntos.
?ordipointlabel
menciona que se basa en pointlabel()
en el paquete maptools , que podría ser otro lugar para buscar inspiración.
Me encontré con un problema similar con varias de las parcelas con las que he estado trabajando y escribí un paquete básico que utiliza la simulación de campo de fuerza para ajustar la ubicación del objeto. Si bien es posible realizar muchas mejoras, incluida la integración con ggplot, etc., parece que se logra la tarea. Lo siguiente ilustra la funcionalidad:
install.packages("FField", type = "source")
install.packages("ggplot2")
install.packages("gridExtra")
library(FField)
FFieldPtRepDemo()