2012-02-25 8 views
12

Estoy tratando de usar ggplot2 y mapas para trazar los nombres de los condados en el estado de Nueva York. Mi enfoque fue encontrar los medios de latitud y longitud por condado (supongo que este es el centro del condado, pero esto puede ser una idea errónea) y luego usar geom_text para trazar los nombres en el mapa. No se está comportando como esperaba, ya que está trazando múltiples nombres por condado.ggplot nombres centrados en un mapa

El resultado que estoy buscando es que el centro de cada texto (condado) esté en el centro de su condado respectivo.

Además de resolver el problema, agradecería que me ayudes a entender qué pasa con mis pensamientos con ggplot.

Gracias de antemano.

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 
cnames <- aggregate(cbind(long, lat) ~ subregion, data=ny, FUN=mean) 

p <- ggplot(ny, aes(long, lat, group=group)) + geom_polygon(colour='black', fill=NA) 
p #p of course plots as expected 

#now add some county names (3 wrong attempts) 
p + geom_text(aes(long, lat, data = cnames, label = subregion, size=.5)) #not correct 

#I said maybe I'm confusing it with the same names for different data sets 
names(cnames) <-c('sr', 'Lo', 'La') 
p + geom_text(Lo, La, data = cnames, label = sr, aes(size=.5)) #attempt 2 
p + geom_text(aes(Lo, La, data = cnames, label = sr, size=.5)) #attempt 3 

Respuesta

24

Puesto que usted está creando dos capas (una para los polígonos y el segundo para las etiquetas), debe especificar la fuente de datos y el mapeo correctamente para cada capa:

ggplot(ny, aes(long, lat)) + 
    geom_polygon(aes(group=group), colour='black', fill=NA) + 
    geom_text(data=cnames, aes(long, lat, label = subregion), size=2) 

Nota:

  • Desde long y lat se producen en ambas tramas de datos, puede utilizar aes(long, lat) en la primera llamada a ggplot. Cualquier mapeo que declare aquí está disponible para todas las capas.
  • Por la misma razón, debe declarar aes(group=group) dentro de la capa de polígono.
  • En la capa de texto, debe mover la fuente de datos fuera del aes.

Una vez que hayas hecho esto, y las parcelas mapa, se dará cuenta que el punto medio es mejor aproximar por la media de range, y permite utilizar un mapa del sistema que respete la relación de aspecto y proyección de coordenadas:

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=2) + 
    coord_map() 

enter image description here

+0

Creo que has hecho lo que pedí y más. Así que estoy marcando este hilo como resuelto. Gracias. Todavía no estoy satisfecho con la ubicación de los nombres y ahora me doy cuenta de que necesito un mejor enfoque para centrarme. El enfoque de Justin se ve interesante. Voy a publicar otra pregunta sobre algunas técnicas de centrado mejoradas. –

+0

Aún mejor para el punto medio es la función centroide en el paquete de geosfera. Esto es lo que hice en lugar de la función de agregado en esta respuesta: 'cnames <- ddply (ia_pop,.(Condado, grupo), resuma, Centroide = centroide (cbind (long, lat))) ' y luego divida la columna Centroide de esta manera: ' cnames $ long <- cnames $ Centroid [, 1] ' y 'cnames $ lat <- cnames $ Centroid [, 2]' – Danny

0

Es sorta parece como centros KMeans sería útil ... Aquí es un mal comienzo ... es tarde!

center.points <- ddply(ny, .(group), function(df) kmeans(df[,1:2], centers=1)$centers)  
center.points$county <- ny$county[ny$group == center.points$group] 
p + geom_text(data=center.points, aes(x=V1, y=V2, label=county)) 
+1

No lo mires ... ¡es horrible! – Justin

4

sé que esto es una vieja pregunta que ha sido contestada, pero quería añadir esto en caso de que alguien se ve aquí en busca de ayuda futuro.

El paquete de mapas tiene la función map.text, que usa centroides de polígono para colocar etiquetas. Al observar su código, se puede ver que usa las funciones apply.polygon y centroid.polygon para encontrar los centroides. Estas funciones no son visibles cuando se carga el paquete, pero todavía se puede acceder:

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 
cnames <- aggregate(cbind(long, lat) ~ subregion, data=ny, FUN=mean) 

# Use the map function to get the polygon data, then find the centroids 
county_poly <- map("county", "new york", plot=FALSE, fill = TRUE) 
county_centroids <- maps:::apply.polygon(county_poly, maps:::centroid.polygon) 

# Create a data frame for graphing out of the centroids of each polygon 
# with a non-missing name, since these are the major county polygons. 
county_centroids <- county_centroids[!is.na(names(county_centroids))] 
centroid_array <- Reduce(rbind, county_centroids) 
dimnames(centroid_array) <- list(gsub("[^,]*,", "", names(county_centroids)), 
           c("long", "lat")) 
label_df <- as.data.frame(centroid_array) 
label_df$county <- rownames(label_df) 

p <- ggplot(ny, aes(long, lat, group=group)) + geom_polygon(colour='black', fill=NA) 

plabels <- geom_text(data=label_df, aes(label=county, group=county)) 
p + plabels 
+0

Sería un poco más útil si el código incluyera la línea para lo que es 'p'. También recibo un error cuando intenta agregar 'p + plabels':' Error en eval (expr, envir, enclos): objeto 'group' no encontrado' –

+1

@ henry-e Cambios realizados, aunque hace mucho tiempo vencido en mi parte. –

Cuestiones relacionadas