r ggplot2

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


Echa un vistazo al nuevo paquete ggrepel . ggrepel proporciona geoms para que ggplot2 rechace las etiquetas de texto superpuestas. Funciona tanto para geom_text como geom_label.

La figura está tomada de este blog .


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()