2012-02-25 18 views
13

Temprano publiqué una pregunta sobre cómo trazar los nombres de condados en un mapa usando ggplot y mapas encontrados HERE. Mi primer acercamiento fue tomar las medias de todas las coordenadas de latitud y larga por el condado como se ve aquí: enter image description hereMejorar el centrado de los nombres de los condados ggplot y mapas

Afortunadamente Andrie tenía 2 sugerencias para mejorar el centrado mediante un centro de rangos y luego el coord_map() {que aparece para mantener la relación de aspecto correcta}. Esto implicó el centrado mucho como se ve aquí: enter image description here

Creo que esto se ve mejor, pero todavía tiene algunas dificultades con los problemas de superposición. Tengo la esperanza de 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.

¿Alguna idea?

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

Respuesta

8

A medida que trabajaba esta última noche encima en Talk Estadísticas (link), en realidad es bastante fácil (como un producto de las horas que pasé en la mañana temprano!) Si se utiliza el paquete espacial R (sp) . Probé algunas de sus otras funciones para crear un objeto SpatialPolygons que puede usar las coordenadas para devolver un centroide de polígono. Solo lo hice para un condado, pero el punto de etiqueta de un 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á para todos los polígonos. Con mucha frecuencia, el proceso de etiquetado y anotación en SIG requiere que ajuste las etiquetas y las anotaciones para aquellos casos peculiares que no se ajustan al enfoque automático (sistemático) que desea usar. 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, elimínelo 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 otro lugar.

+0

Esto mejora el centrado aún más, pero como usted señaló, algunos de los ajustes finos tendrán que ser giratorios y giratorios, tirando y metiendo (quizás no asomando pero ...). Creo que esta es la respuesta que estaba buscando. –

+1

Para obtener más información sobre la ubicación de puntos (una función de localización para ggplot), consulte [AQUÍ] (http://stackoverflow.com/questions/9450873/locator-equivalent-in-ggplot2-for-maps). Esta función de David Kahle le permite generar un marco de datos de los puntos seleccionados para facilitar la manipulación de las etiquetas del condado a través de los métodos que describo arriba. –

0

Usted puede tomar un vistazo al paquete directlabels, esto proporciona la colocación de etiquetas automáticas usando una serie de algoritmos que evitar la superposición. No estoy seguro si se puede usar para resolver su problema, pero podría echarle un vistazo.

+0

Jugué con las etiquetas directas para este problema y no vi una forma de aplicarlo. 'directlabels' parece funcionar con una leyenda (como reemplazo) –

+0

Ok, lástima que no funcionó. –

1

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: Before

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: enter image description here

A menos que alguien tiene una mejor manera voy a marcar esta respuesta como correcta.

0

Existe el PAL labeling library que parece hacer exactamente lo que está buscando, automáticamente. Esta captura de pantalla se toma de su página web:

PAL website screenshot

no he encontrado una interfaz R para ella, sin embargo. El quick guide to perform your own integration of PAL within your favourite GIS application 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.

+0

Esto parece prometedor. Gracias por compartir. Si alguien creara un paquete R que interactúe de una manera sensata, tendrá un paquete muy útil (aunque esto está más allá de mi nivel de habilidad actual). –

Cuestiones relacionadas