Tengo una base de datos que contiene idiomas, sus longitudes y latitudes y un valor de característica (ya sea categoría 1, categoría 2 o ambas; en la gráfica, estos están marcados en rojo, azul y verde, respectivamente). Puede haber hasta tres puntos por idioma y, naturalmente, dos puntos de idioma pueden estar muy cerca uno del otro.
name longitude latitude sp_sum
1 Modern Armenian 45 40 both
2 Modern Armenian 45 40 both
3 Modern Armenian 45 40 spatial
4 Dieri 138 -28.1667 both
5 Dieri 138 -28.1667 both
6 Finnish 25.5577 64.7628 non-spatial
7 Crimean Tatar 28.1418 43.8398 spatial
8 Ese Ejja -67.515 -11.7268 non-spatial
9 Makhuwa 38.8052 -14.8509 non-spatial
...
Estoy usando el paquete R ggplot2 (ese es el que estoy más familiarizado, así que me encantaría seguir usándolo, pero otras soluciones también son bienvenidas). Aquí hay un recorte de un intento anterior (código: ver abajo 1 ):
Para cada punto, me gustaría que la posición (aproximada), así como el valor, aún estén visibles. (Si hay varios puntos para un solo idioma, se pueden combinar).
¿Hay alguna forma de ...?
- ... para mover los puntos hacia un lado lo suficiente como para que no haya exceso de trazado (menos al azar que, digamos, al usar geom_jitter, por ejemplo, hay mucho de ese tipo de esquiva en el paquete de abejas ).
- ... y / o tener algún tipo de "línea" apuntando a la posición original de un punto si tuviera que ser movido?
- ... o para combinar puntos cercanos de una manera que todavía estén claros (probablemente existe una técnica de trabajo que utiliza binning, es decir, stat_bin * o algo con un efecto similar)?
... o para crear una "trama interactiva" como las que se ven en sitios web que aún se pueden incluir en un pdf (estoy pensando también en las capacidades de paquetes como animación y brillo aquí)? Por ejemplo, se ve así en wals.info :
De una publicación anterior aquí, sé que el paquete directlabels puede mover etiquetas, pero no he encontrado una manera de hacerlo mover los puntos también.
¡No dude en pedir una aclaración!
Nota: Soy consciente de que ha habido una serie de preguntas sobre el trazado excesivo, pero las que he investigado parecen tener un propósito diferente (es decir, estadístico) (no pretendo haberlo leído todo , así que ' estaría encantado de aceptar un enlace también, por supuesto). Intentaré enumerar las publicaciones que conozco y que pueden ser relevantes (por lo que he leído, ninguna de estas responde exactamente a mi pregunta).
- stats.SE: ¿Cómo evito superponer etiquetas en un gráfico R?
- SO: posicionamiento de etiqueta de punto de datos dinámico en ggmap
1 Las siguientes líneas de código crearon el recorte desde arriba.
library(OpenStreetMap)
library(ggplot2)
data <- read.csv(header = T, sep = ",", dec = ".", quote= "'",
text = "'','name','longitude','latitude','sp_sum'
'1','Modern Armenian',45,40,'both'
'2','Modern Armenian',45,40,'both'
'3','Modern Armenian',45,40,'spatial'
'4','Dieri',138,-28.1667,'both'
'5','Dieri',138,-28.1667,'both'
'6','Finnish',25.5577,64.7628,'non-spatial'
'7','Crimean Tatar',28.1418,43.8398,'spatial'
'8','Sochiapam Chinantec',-96.6079,17.7985,'non-spatial'
'9','Ese Ejja',-67.515,-11.7268,'non-spatial'
'10','Makhuwa',38.8052,-14.8509,'non-spatial'
'11','Mualang',111.077,0.31083,'non-spatial'
'12','Martuthunira',116.607,-20.9294,'non-spatial'
'13','Evenki',108.626,53.85,'both'
'14','Afrikaans',30,-22,'both'
'15','Male (Ethiopia)',36.9892,5.91975,'both'
'16','Manchu',126.557,47.3122,'both'
'17','Dime',36.3329,6.20951,'non-spatial'
'18','Koorete',37.8679,5.80545,'non-spatial'
'19','Wolaytta',37.7537,6.32668,'both'
'20','Dizin',35.5763,6.1405,'both'")
map <- openproj(openmap(c(85, -179.9), c(-60, 179.9), zoom = 2, type = "nps"))
plot <- autoplot(map) +
geom_point(data = data, aes(x = longitude, y = latitude),
color = "white", alpha = 0.8, size = 8) +
geom_point(data = data, aes(x = longitude, y = latitude, color = sp_sum),
alpha = 0.3, size = 4)
plot
fuente
Respuestas:
Hasta ahora solo he encontrado una solución bastante decente: el paquete packcircles R puede haber sido diseñado para otro propósito, pero hace un buen trabajo alejando los puntos unos de otros (también vea la publicación de blog correspondiente ). Es posible que no entienda todo el funcionamiento interno de este paquete, pero afortunadamente, como verá, el archivo de ejemplo del sitio web se puede usar casi directamente: todo lo que necesita cambiar son los nombres de las variables, la distancia entre los círculos (o puntos , dependiendo de las funciones que utilice) y los "límites" del gráfico (es decir, 180 °).
(Al final, todo se reduce a la
circleLayout()
función, que toma un marco de datos con columnas de longitud, lat y radio (es decir, distancia) y dos vectores xlim / ylim de 2 números: devuelve el marco de datos con posiciones de puntos mejoradas.fuente
¿Algo así, tal vez?
fuente