1) ¿Existe alguna biblioteca / función R que implemente la colocación de etiquetas INTELIGENTES en el gráfico R? Intenté algunos, pero todos son problemáticos: muchas etiquetas se superponen entre sí o en otros puntos (u otros objetos en la trama, pero veo que esto es mucho más difícil de manejar).
2) Si no es así, ¿hay alguna manera de ayudar CÓMODAMENTE al algoritmo con la ubicación de la etiqueta para puntos problemáticos particulares? Se busca la solución más cómoda y eficiente.
Puede jugar y probar otras posibilidades con mi ejemplo reproducible y ver si puede lograr mejores resultados que yo:
# 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 desea colocar etiquetas para todos los puntos, sino solo para los valores atípicos, pero aún así, las etiquetas a menudo se colocan incorrectamente:
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} .
install.packages("FField")
library(FField)
FFieldPtRepDemo()
Respuestas:
Primero, aquí están los resultados de mi solución a este problema:
Hice esto a mano en Preview (visor de imágenes / PDF muy básico en OS X) en solo unos minutos. ( Editar: el flujo de trabajo fue exactamente lo que esperaría: guardé el gráfico como PDF de R, lo abrí en Vista previa y creé cuadros de texto con las etiquetas deseadas (9pt Helvetica) y luego simplemente los arrastré con el mouse hasta que se veían bien. Luego exporté a PNG para subirlo a SO).
Ahora, antes de sucumbir al fuerte impulso de rechazar esto en el olvido y dejar comentarios sarcásticos sobre cómo se trata de automatizar este proceso, ¡escúchame!
Buscar soluciones algorítmicas está totalmente bien y (en mi humilde opinión) realmente interesante. Pero, para mí, las situaciones de etiquetado de puntos se dividen aproximadamente en tres categorías:
text
) no es que mucho esfuerzo.: subirse a la caja de jabón:
Dado que la gente como nosotros amamos automatización, creo que a menudo caemos en la trampa de pensar que casi todos los aspectos de la producción de un buen gráfico estadístico deben automatizarse. Respetuosamente (¡humildemente!) No estoy de acuerdo.
No existe un entorno de trazado estadístico perfectamente general que cree automáticamente la imagen que tiene en su cabeza. Cosas como R, ggplot2, lattice, 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 caja de jabón:
También me gustaría señalar que creo que todos podríamos crear diagramas de dispersión con <10-15 puntos que serán casi imposibles de etiquetar limpiamente, incluso a mano, y es probable que rompan cualquier solución automática que se le ocurra.
Finalmente, quiero reiterar que sé que esta no es la respuesta que está buscando. Y yo no diciendo que los intentos algorítmicos son inútiles o tontos. ¡Voté esta pregunta y con gusto votaré a favor de las soluciones algorítmicas interesantes!
La razón por la que publiqué esta respuesta es que creo que esta pregunta debería ser la pregunta canónica de "etiquetado de puntos en R" para futuros duplicados, y creo que las soluciones que involucran el etiquetado manual merecen un asiento en la mesa, eso es todo.
fuente
ggrepel
parece prometedor cuando se aplica aggplot2
diagramas de dispersión.fuente
¿Has probado el paquete directlabels ?
Y, por cierto, los argumentos pos y offset pueden tomar vectores para permitirle colocarlos en las posiciones correctas cuando hay un número razonable de puntos en solo unas pocas ejecuciones de la gráfica.
fuente
plot()
trazado normal ? No tuve éxito intentándolo así que ... ¡Gracias! PD: @SpacedMan & Ben, limpié mis comentarios con respecto a la actualización de R, ya que no son tan interesantes, puedes hacer lo mismo.¡Encontré alguna solución! Desafortunadamente, no es el mejor ni el ideal, pero es el que mejor funciona para mí ahora. Es mitad algorítmico, mitad manual, por lo que ahorra tiempo en comparación con la solución manual pura esbozada por joran.
¡Pasé por alto una parte muy importante de la
?identify
ayuda!Entonces, si usa la
identify()
solución como escribí en mi pregunta, entonces puede afectar la posición de la etiqueta no haciendo clic directamente en ese punto, ¡sino haciendo clic al lado de ese punto relativamente en la dirección deseada! ¡Funciona genial!La desventaja es que solo hay 4 posiciones (arriba, izquierda, abajo, derecha), pero agradecería más las otras 4 (arriba a la izquierda, arriba a la derecha, abajo a la izquierda, abajo a la derecha) ... use esto para etiquetar puntos donde no me molesta y el resto de los puntos que etiqueto directamente en mi presentación de Powerpoint, como propuso Joran :-)
PD: Todavía no he probado la solución directlabels lattice / ggplot, todavía prefiero usar la biblioteca de gráficos básica.
fuente
Te sugiero que eches un vistazo al
wordcloud
paquete. Sé que este paquete no se centra exactamente en los puntos, sino en las propias etiquetas, y también el estilo parece 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ó aproximadamente en el momento en que hizo la pregunta, por lo que todavía es muy nueva.http://blog.fellstat.com/?cat=11
fuente
Escribí una función R llamada
addTextLabels()
dentro de un paqueteplotteR
. El paquete se puede instalar directamente en su biblioteca de R usando el siguiente código:Para el ejemplo proporcionado, utilicé el siguiente código para generar la figura de ejemplo vinculada a continuación.
Funciona seleccionando automáticamente una ubicación alternativa de una fina cuadrícula de puntos. Los puntos más cercanos en la cuadrícula se visitan primero y se seleccionan si no se superponen con puntos o etiquetas trazados. Eche un vistazo al código fuente , si está interesado.
fuente
No es una respuesta, pero es demasiado larga para un comentario. Un enfoque muy simple que puede funcionar en casos simples, en algún lugar entre el posprocesamiento de joran y los algoritmos más sofisticados que se han presentado, es realizar
in-place
transformaciones simples en el marco de datos.Ilustro esto con
ggplot2
porque estoy más familiarizado con esa sintaxis que los gráficos base R.Como puede ver, en este caso el resultado no es ideal, pero puede ser lo suficientemente bueno para algunos propósitos. Y es bastante sencillo, por lo general algo como esto es suficiente
within(df, y <- y+.01)
fuente
df
usowithin
, a menudo hago esto ajustando la estética:geom_text(aes(x = x - .01, y = y + .01), hjust = 0, vjust = 0)
parece más limpio.