2015-10-23 1 views
7

J'ai une carte de ggplot, par exemple:étiquettes de latitude Format et axe de longitude en ggplot

library(ggmap) 
ggmap(get_map()) 

Je voudrais les étiquettes d'axe à étiqueter automatiquement NS/WE: dans le cas ci-dessus, par exemple Au lieu de -95,4, il devrait montrer 95,4 ° E.

J'ai essayé de jouer avec le paquet scales et en utilisant scale_x_continuous et scale_y_continuous étiquettes et options pauses, mais je ne l'ai pas réussi à le faire fonctionner. Il serait génial d'avoir un scale_y_latitude et un scale_x_longitude.

EDIT: Merci à la réponse de @Jaap je suis arrivé à ce qui suit:

scale_x_longitude <- function(xmin=-180, xmax=180, step=1, ...) { 
    ewbrks <- seq(xmin,xmax,step) 
    ewlbls <- unlist(lapply(ewbrks, function(x) ifelse(x < 0, paste(x, "W"), ifelse(x > 0, paste(x, "E"),x)))) 
    return(scale_x_continuous("Longitude", breaks = ewbrks, labels = ewlbls, expand = c(0, 0), ...)) 
} 
scale_y_latitude <- function(ymin=-90, ymax=90, step=0.5, ...) { 
    nsbrks <- seq(ymin,ymax,step) 
    nslbls <- unlist(lapply(nsbrks, function(x) ifelse(x < 0, paste(x, "S"), ifelse(x > 0, paste(x, "N"),x)))) 
    return(scale_y_continuous("Latitude", breaks = nsbrks, labels = nslbls, expand = c(0, 0), ...)) 
} 

Ce qui fonctionne assez bien. Mais pour une raison quelconque, mon R ne semble pas aimer le symbole du degré devant le point cardinal ... Il est affiché comme un simple point, par ex. la longitude -24 devient 24..W

Répondre

12

Malheureusement, il n'y a pas encore scale_x_longitude ou scale_y_latitude. En attendant voici une solution dans laquelle vous spécifiez les étiquettes à l'avance:

# load the needed libraries 
library(ggplot2) 
library(ggmap) 

# get the map 
m <- get_map(location=c(lon=0,lat=0),zoom=5) 

# create the breaks- and label vectors 
ewbrks <- seq(-10,10,5) 
nsbrks <- seq(-10,10,5) 
ewlbls <- unlist(lapply(ewbrks, function(x) ifelse(x < 0, paste(x, "°E"), ifelse(x > 0, paste(x, "°W"),x)))) 
nslbls <- unlist(lapply(nsbrks, function(x) ifelse(x < 0, paste(x, "°S"), ifelse(x > 0, paste(x, "°N"),x)))) 

# create the map 
ggmap(m) + 
    geom_blank() + 
    scale_x_continuous(breaks = ewbrks, labels = ewlbls, expand = c(0, 0)) + 
    scale_y_continuous(breaks = nsbrks, labels = nslbls, expand = c(0, 0)) + 
    theme(axis.text = element_text(size=12)) 

qui donne:

enter image description here


Pour obtenir les degrés dans les fonctions, vous pouvez augmenter la o comme exposant (qui contournera la nécessité d'un symbole spécial):

scale_x_longitude <- function(xmin=-180, xmax=180, step=1, ...) { 
    xbreaks <- seq(xmin,xmax,step) 
    xlabels <- unlist(lapply(xbreaks, function(x) ifelse(x < 0, parse(text=paste0(x,"^o", "*W")), ifelse(x > 0, parse(text=paste0(x,"^o", "*E")),x)))) 
    return(scale_x_continuous("Longitude", breaks = xbreaks, labels = xlabels, expand = c(0, 0), ...)) 
} 
scale_y_latitude <- function(ymin=-90, ymax=90, step=0.5, ...) { 
    ybreaks <- seq(ymin,ymax,step) 
    ylabels <- unlist(lapply(ybreaks, function(x) ifelse(x < 0, parse(text=paste0(x,"^o", "*S")), ifelse(x > 0, parse(text=paste0(x,"^o", "*N")),x)))) 
    return(scale_y_continuous("Latitude", breaks = ybreaks, labels = ylabels, expand = c(0, 0), ...)) 
}  

ggmap(m) + 
    geom_blank() + 
    scale_x_longitude(xmin=-10, xmax=10, step=5) + 
    scale_y_latitude(ymin=-10, ymax=10, step=5) + 
    theme(axis.text = element_text(size=12)) 

qui donne la carte suivante:

enter image description here

J'utilisé geom_blank juste pour illustrer l'effet désiré. Vous pouvez bien entendu utiliser d'autres géométries (par exemple geom_point) pour tracer vos données sur la carte.

+0

La réponse est très bonne, merci, mais je ne la considère pas comme étant acceptée car je suis à la recherche d'une approche automatisée, comme lorsque vous faites 'la bibliothèque (échelles); p + scale_y_continuous (labels = percent) '(voir http://docs.ggplot2.org/current/scale_continuous.html) ... d'ailleurs, mon R ne semble pas aimer le symbole du degré dans" ° E ". .. il n'est pas rendu correctement pour une raison quelconque. Des idées? – AF7

+0

@ AF7 Je pense avoir trouvé une solution pour le symbole des degrés. Voir la mise à jour. – Jaap

+0

Merci, cela ressemble à une bonne solution. – AF7