orlando - condados de tennessee
Mejorar el centrado de los nombres de los condados ggplot y mapas (4)
Antes publiqué una pregunta sobre cómo trazar los nombres de los condados en un mapa usando ggplot y los mapas que se encuentran AQUÍ . Mi primer enfoque fue tomar los medios de todas las coordenadas lat y long por condado como se ve aquí:
Afortunadamente, Andrie tuvo 2 sugerencias para mejorar el centrado usando un centro de rangos y luego el coord_map () {que parece mantener la relación de aspecto correcta}. Esto implicó el centrar mucho como se ve aquí:
Creo que esto se ve mejor, pero todavía tiene algunas dificultades con los problemas de superposición. Espero mejorar aún más el centrado (En ese mismo hilo, Justin sugirió un enfoque de kmeans). Estoy de acuerdo con rotar el texto si es necesario pero espero que los nombres queden centrados y rotados si es necesario (se extienden más allá de los límites del condado) para mostrar mejor los nombres de los condados en el mapa.
¿Algunas ideas?
library(ggplot2); library(maps)
county_df <- map_data(''county'') #mappings of counties by state
ny <- subset(county_df, region=="new york") #subset just for NYS
ny$county <- ny$subregion
p <- ggplot(ny, aes(long, lat, group=group)) + geom_polygon(colour=''black'', fill=NA)
#my first approach to centering
cnames <- aggregate(cbind(long, lat) ~ subregion, data=ny, FUN=mean)
ggplot(ny, aes(long, lat)) +
geom_polygon(aes(group=group), colour=''black'', fill=NA) +
geom_text(data=cnames, aes(long, lat, label = subregion), size=3)
#Andrie''s much improved approach to centering
cnames <- aggregate(cbind(long, lat) ~ subregion, data=ny,
FUN=function(x)mean(range(x)))
ggplot(ny, aes(long, lat)) +
geom_polygon(aes(group=group), colour=''black'', fill=NA) +
geom_text(data=cnames, aes(long, lat, label = subregion), size=3) +
coord_map()
Puede echarle un vistazo al paquete directlabels
, que proporciona la colocación automática de etiquetas utilizando una serie de algoritmos que evitan la superposición. No estoy seguro si se puede usar para resolver su problema, pero podría echarle un vistazo.
Creo que la respuesta más fácil a esta pregunta es que Andrie ya ha resuelto la mayoría del trabajo manual. El resto debe completarse con algunos buenos métodos de ajuste y visualización. Cuando miras la trama después de la sugerencia de Andrie, la mayoría de todo es decente, con la excepción de algunas ubicaciones molestas que podrían mejorarse con un cambio de latitud / longitud o una rotación. Tengo un ejemplo para suffolk (abajo a la derecha) y herkimer (centro) ya que la ubicación de suffolk podría mejorarse mediante un ajuste lat / long y herkimer a través de una rotación.
Antes de:
cnames <- aggregate(cbind(long, lat) ~ subregion, data=ny,
FUN=function(x)mean(range(x))) #Andrie''s code
cnames[52, 2:3] <- c(-73, 40.855) #adjust the long and lat of poorly centered names
cnames$angle <- rep(0, nrow(cnames)) #create an angle column
cnames[22, 4] <- -90 #adjust the angle of atypically shaped
ggplot(ny, aes(long, lat)) +
geom_polygon(aes(group=group), colour=''black'', fill=NA) +
geom_text(data=cnames, aes(long, lat, label = subregion, colour=col,
angle=angle), size=3) + coord_map()
Esto nos da:
A menos que alguien tenga una mejor manera, marcaré esta respuesta como correcta.
Cuando resolví anoche en Talk Stats ( enlace ), en realidad es bastante fácil (¡como producto de las horas que pasé en la madrugada!) Si usas el paquete espacial R ( sp ). Probé algunas de sus otras funciones para crear un objeto SpatialPolygons en el que puede usar coordenadas para devolver un centroide de polígono. Solo lo hice para un condado, pero el punto de etiqueta de un objeto Polygon (S4) coincidía con el centroide. Suponiendo que esto sea cierto, los puntos de etiqueta de los objetos del polígono son centroides. Utilizo este pequeño proceso para crear un marco de datos de centroides y usarlos para trazar en un mapa.
library(ggplot2) # For map_data. It''s just a wrapper; should just use maps.
library(sp)
library(maps)
getLabelPoint <- # Returns a county-named list of label points
function(county) {Polygon(county[c(''long'', ''lat'')])@labpt}
df <- map_data(''county'', ''new york'') # NY region county data
centroids <- by(df, df$subregion, getLabelPoint) # Returns list
centroids <- do.call("rbind.data.frame", centroids) # Convert to Data Frame
names(centroids) <- c(''long'', ''lat'') # Appropriate Header
map(''county'', ''new york'')
text(centroids$long, centroids$lat, rownames(centroids), offset=0, cex=0.4)
Esto no funcionará bien para cada polígono. Muy a menudo, el proceso de etiquetado y anotación en SIG requiere que ajuste las etiquetas y anotaciones para aquellos casos peculiares que no se ajustan al enfoque automático (sistemático) que desea utilizar. El enfoque code-look-recode que llevaríamos a esto no es apto. Es mejor incluir un cheque que una etiqueta de un tamaño dado para el diagrama dado encajará dentro del polígono; de lo contrario, quítelo del registro de etiquetas de texto e insértelo manualmente más adelante para que se ajuste a la situación; por ejemplo, agregue una línea guía y anote en el lateral del polígono o gire la etiqueta hacia los lados como se muestra en otra parte.
Existe la biblioteca de etiquetado PAL que parece hacer exactamente lo que está buscando, automáticamente. Esta captura de pantalla se toma de su sitio web:
No he encontrado una interfaz R para eso. La guía rápida para realizar su propia integración de PAL dentro de su aplicación GIS favorita sugiere que la integración misma debería ser factible. Sin embargo, en el contexto de ggplot2, esto significa que la colocación de la etiqueta debe realizarse durante el procesamiento; no tengo idea de si esto es posible o qué hacer para lograrlo.