varias superponer lineas graficos graficas ggplot barplot r plot label

superponer - Colocación inteligente de etiquetas de puntos en R



superponer graficas en r ggplot (6)

¡Encontré alguna solución! No es definitivo e ideal desafortunadamente, pero es el que funciona mejor para mí ahora. Es mitad algorítmica, mitad manual, por lo que ahorra tiempo en comparación con la solución manual pura dibujada por joran.

Pasé por alto una parte muy importante de ?identify ayuda".

El algoritmo utilizado para colocar etiquetas es el mismo que usa el texto si se especifica pos, la diferencia es que la posición del puntero relativo al punto identificado determina pos en identificar.

Entonces, si usa la solución de identify() como escribí en mi pregunta, puede afectar la posición de la etiqueta al no hacer clic directamente en ese punto, sino al hacer clic en ese punto relativamente en la dirección deseada. Funciona simplemente genial!

La desventaja es que solo hay 4 posiciones (arriba, izquierda, abajo, derecha), pero apreciaría más las otras 4 (arriba a la izquierda, arriba a la derecha, abajo a la izquierda, abajo a la derecha) ... Así que Úselo para etiquetar los puntos donde no me molesta y el resto de los puntos que etiqueto directamente en mi presentación de Powerpoint, como Joran propuso :-)

PD: Todavía no he probado la solución directlabels lattice / ggplot, aún prefiero usar la biblioteca básica de gráficos.

1) ¿Hay alguna biblioteca / función R que implemente la colocación de etiqueta INTELIGENTE en el diagrama R? Intenté algunas, pero todas son problemáticas: muchas etiquetas se superponen una a otra u otros puntos (u otros objetos en la trama, pero veo que esto es mucho más difícil de manejar).

2) De lo contrario, ¿hay alguna manera de cómo ayudar CÓMODAMENTE al algoritmo con la ubicación de la etiqueta para puntos problemáticos particulares? Se quería la solución más cómoda y eficiente.

Puedes jugar y probar otras posibilidades con mi ejemplo reproducible y ver si puedes lograr mejores resultados que los que tengo:

# data x = c(0.8846, 1.1554, 0.9317, 0.9703, 0.9053, 0.9454, 1.0146, 0.9012, 0.9055, 1.3307) y = c(0.9828, 1.0329, 0.931, 1.3794, 0.9273, 0.9605, 1.0259, 0.9542, 0.9717, 0.9357) ShortSci = c("MotAlb", "PruMod", "EriRub", "LusMeg", "PhoOch", "PhoPho", "SaxRub", "TurMer", "TurPil", "TurPhi") # basic plot plot(x, y, asp=1) abline(h = 1, col = "green") abline(v = 1, col = "green")

Para el etiquetado, probé estas posibilidades, nadie es realmente bueno:

1) este es terrible:

text(x, y, labels = ShortSci, cex= 0.7, offset = 10)

2) este es bueno si no quieres colocar etiquetas para todos los puntos, sino solo para los valores atípicos, pero aún así, las etiquetas a menudo se colocan mal:

identify(x, y, labels = ShortSci, cex = 0.7)

3) este parecía prometedor pero existe el problema de que las etiquetas estén demasiado cerca de los puntos; Tuve que rellenarlos con espacios, pero esto no ayuda mucho:

require(maptools) pointLabel(x, y, labels = paste(" ", ShortSci, " ", sep=""), cex=0.7)

4)

require(plotrix) thigmophobe.labels(x, y, labels = ShortSci, cex=0.7, offset=0.5)

5)

require(calibrate) textxy(x, y, labs=ShortSci, cx=0.7)

¡Gracias de antemano!

EDITAR: todo: prueba labcurve {Hmisc} .


¿Has probado el paquete directlabels ?

Y, por cierto, los argumentos pos y offset pueden tomar vectores para permitirle ubicarlos en las posiciones correctas cuando hay un número razonable de puntos en tan solo unas pocas vueltas.


No es una respuesta, pero es demasiado tiempo para un comentario. Un enfoque muy simple que puede funcionar en casos simples, en algún lugar entre el postprocesamiento de joran y los algoritmos más sofisticados que se han presentado, es realizar transformaciones simples in-place en el marco de datos.

Lo ilustraré con ggplot2 porque estoy más familiarizado con esa sintaxis que con los gráficos R base.

df <- data.frame(x = x, y = y, z = ShortSci) library("ggplot2") ggplot(data = df, aes(x = x, y = y, label = z)) + theme_bw() + geom_point(shape = 1, colour = "green", size = 5) + geom_text(data = within(df, c(y <- y+.01, x <- x-.01)), hjust = 0, vjust = 0)

Como puede ver, en este caso el resultado no es ideal, pero puede ser lo suficientemente bueno para algunos propósitos. Y es bastante fácil, típicamente algo así es suficiente within(df, y <- y+.01)


Primero, aquí están los resultados de mi solución a este problema:

Hice esto a mano en Preview (muy básico PDF / visor de imágenes en OS X) en solo unos minutos. ( Editar: El flujo de trabajo era exactamente lo que esperarías: guardé el gráfico como un PDF desde R, lo abrí en Vista previa y creé cuadros de texto con las etiquetas deseadas (9 pt Helvetica) y luego los arrastré con el mouse hasta que parecieron Bien. Luego exporté a PNG para cargarlo en SO.)

Ahora, antes de sucumbir al fuerte impulso de votar por esto en el olvido y dejar comentarios sarcásticos sobre cómo el punto es automatizar este proceso, ¡escúchame!

Buscar soluciones algorítmicas es totalmente correcto, y (en mi humilde opinión) realmente interesante. Pero, para mí, las situaciones de etiquetado de puntos se dividen en tres categorías:

  1. Tienes un pequeño número de puntos, ninguno muy parecido . En este caso, una de las soluciones que enumeró en la pregunta probablemente funcione con ajustes mínimos.
  2. Tiene una pequeña cantidad de puntos, algunos de los cuales están demasiado ajustados para que las soluciones algorítmicas típicas den buenos resultados . En este caso, dado que solo tiene una pequeña cantidad de puntos, etiquetarlos a mano (ya sea con un editor de imágenes o sintonizar su llamada al text ) no es demasiado esfuerzo.
  3. Usted tiene una cantidad bastante grande de puntos . En este caso, realmente no debería etiquetarlos de todos modos, ya que es difícil procesar grandes cantidades de etiquetas visualmente.

: subir a la tribuna:

Como a la gente como nosotros nos encanta la automatización, creo que a menudo caemos en la trampa de pensar que casi todos los aspectos de producir un buen gráfico estadístico deberían ser automáticos. Respetuosamente (¡humildemente!) Estoy en desacuerdo.

No existe un entorno de trazado estadístico perfectamente general que cree automágicamente la imagen que tiene en su cabeza. Cosas como R, ggplot2, celosía, etc. hacen la mayor parte del trabajo; pero ese pequeño ajuste adicional, agregar una línea aquí, ajustar un margen allí, probablemente sea más adecuado para una herramienta diferente.

: bajando de la tribuna:

También me gustaría señalar que creo que todos podríamos encontrar diagramas de dispersión con <10-15 puntos que serán casi imposibles de etiquetar limpiamente, incluso a mano, y que probablemente rompan cualquier solución automática que surja.

Finalmente, quiero reiterar que sé que esta no es la respuesta que estás buscando. Y no estoy diciendo que los intentos algorítmicos sean inútiles o tontos. Volví a votar esta pregunta y felizmente recomendé soluciones algorítmicas interesantes.

La razón por la que publiqué esta respuesta es porque creo que esta pregunta debería ser la pregunta canónica "etiquetado de puntos en R" para futuros duplicados, y creo que las soluciones que implican el etiquetado a mano merecen un asiento en la mesa, eso es todo.


Te sugiero que eches un vistazo al paquete wordcloud . Sé que este paquete se enfoca no exactamente en los puntos, sino en las etiquetas mismas, y también el estilo parece ser bastante fijo. Pero aún así, los resultados que obtuve al usarlo fueron bastante impresionantes. También tenga en cuenta que la versión del paquete en cuestión se publicó sobre la hora en que hizo la pregunta, por lo que todavía es muy nueva.

http://blog.fellstat.com/?cat=11


ggrepel parece prometedor cuando se aplica a ggplot2 diagramas de dispersión.

# data x = c(0.8846, 1.1554, 0.9317, 0.9703, 0.9053, 0.9454, 1.0146, 0.9012, 0.9055, 1.3307) y = c(0.9828, 1.0329, 0.931, 1.3794, 0.9273, 0.9605, 1.0259, 0.9542, 0.9717, 0.9357) ShortSci = c("MotAlb", "PruMod", "EriRub", "LusMeg", "PhoOch", "PhoPho", "SaxRub", "TurMer", "TurPil", "TurPhi") df <- data.frame(x = x, y = y, z = ShortSci) library(ggplot2) library(ggrepel) ggplot(data = df, aes(x = x, y = y)) + theme_bw() + geom_text_repel(aes(label = z), box.padding = unit(0.45, "lines")) + geom_point(colour = "green", size = 3)