2017-08-15 1 views
1

la question/problème est très similaire à l'original question: change les degrés décimaux en degrés minutes secondes dans les étiquettes d'axe ggplot.Réexamen du "Format des étiquettes d'axe de latitude et de longitude dans ggplot"

Je procédez comme suit:

library(ggplot2) 
library(ggmap) 

#get my map 
city<- get_map(location = c(lon= -54.847, lat= -22.25), 
       maptype = "satellite",zoom = 11,color="bw") 

map<-ggmap(city,extent="normal")+ 
    xlab("Longitude")+ ylab("Latitude") 
map 

First map

De plus, je suis en train ce @Jaap a écrit:

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), ...)) 
} 

Alors:

map+ 
    scale_x_longitude(-55.0,-54.7,4)+ 
    scale_y_latitude(-22.4,-22.1,4) 

Second map

Dans la deuxième carte, seules deux coordonnées sont dessinées et dans le mauvais format. J'ai besoin de ces corrdinates écrit comme suit:

55ºW, 54ºW 54 ', 54ºW 48', 54ºW 42 '; 22ºS 24 ', 22ºS 18', 22ºS 12 ', 22ºS 06'

Quelqu'un peut-il m'aider?

Mise à jour (16/08/2017) Voici un code de mise à jour fournie par @Rafael Cunha (Merci beaucoup!) Il manque encore un moyen d'ajouter des minutes symbole. Cependant, cela fonctionne mieux qu'avant.

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(paste0(abs(dms(x)$d),"^{o}*"), 
             paste0(abs(dms(x)$m)), "*W")), 
      ifelse(x > 0, parse(text=paste0(paste0(abs(dms(x)$d),"^{o}*"), 
              paste0(abs(dms(x)$m)),"*E")), 
        abs(dms(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(paste0(abs(dms(x)$d),"^{o}*"), 
             paste0(abs(dms(x)$m)),"*S"), 
      ifelse(x > 0, parse(text=paste0(paste0(abs(dms(x)$d),"^{o}*"), 
              paste0(abs(dms(x)$m)),"*N")), 
        abs(dms(x))))})) 
    return(scale_y_continuous("Latitude", breaks = ybreaks, labels = ylabels, expand = c(0, 0), ...)) 
} 

map+ 
    scale_x_longitude(-55.0,-54.7,.1)+ 
    scale_y_latitude(-22.4,-22.1,.1) 

Répondre

0

@Thiago Silva Teles,

hors du bâtiment du code qui @Rafael Cunha fourni (Merci, je serai en utilisant cela aussi), la fonction d'expression fonctionne (pour moi de toute façon) pour fournir des degrés, des minutes et des secondes étiquettes sur l'axe du tracé.

Fonctions de conversion DD en DMS pour le tracé d'axe ggmap.

scale_x_longitude <- function(xmin=-180, xmax=180, step=0.002, ...) { 
    xbreaks <- seq(xmin,xmax,step) 
    xlabels <- unlist(
    lapply(xbreaks, function(x){ 
     ifelse(x < 0, parse(text=paste0(paste0(abs(dms(x)$d), expression("*{degree}*")), 
             paste0(abs(dms(x)$m), expression("*{minute}*")), 
             paste0(abs(dms(x)$s)), expression("*{second}*W"))), 
      ifelse(x > 0, parse(text=paste0(paste0(abs(dms(x)$d), expression("*{degree}*")), 
              paste0(abs(dms(x)$m), expression("*{minute}*")), 
              paste0(abs(dms(x)$s)), expression("*{second}*E"))), 
        abs(dms(x))))})) 
    return(scale_x_continuous("Longitude", breaks = xbreaks, labels = xlabels, expand = c(0, 0), ...)) 
} 

scale_y_latitude <- function(ymin=-90, ymax=90, step=0.002, ...) { 
    ybreaks <- seq(ymin,ymax,step) 
    ylabels <- unlist(
    lapply(ybreaks, function(x){ 
     ifelse(x < 0, parse(text=paste0(paste0(abs(dms(x)$d), expression("*{degree}*")), 
             paste0(abs(dms(x)$m), expression("*{minute}*")), 
             paste0(abs(dms(x)$s)), expression("*{second}*S"))), 
      ifelse(x > 0, parse(text=paste0(paste0(abs(dms(x)$d), expression("*{degree}*")), 
              paste0(abs(dms(x)$m), expression("*{minute}*")), 
              paste0(abs(dms(x)$s)), expression("*{second}*N"))), 
        abs(dms(x))))})) 
    return(scale_y_continuous("Latitude", breaks = ybreaks, labels = ylabels, expand = c(0, 0), ...)) 
} 

carte Exemple pour StackExchange

library(ggplot2) 
library(ggmap) 
map <- get_map(location = "Alabama", 
       zoom = 8, 
       maptype = "toner", source = "stamen", 
       color = "bw") 
sam_map <- ggmap(map) + 
    theme_minimal() + theme(legend.position = "none") 

sam_map + 
    scale_x_longitude(-89, -85, 0.75) + 
    scale_y_latitude(30, 34, 0.75) 

je devais bricoler « étape » (dans le code fonction et appel) pour avoir afficher correctement et à intervalles souhaités. Cela pourrait encore être amélioré pour omettre des secondes ou des minutes à plus grande échelle. J'aime bien le fait qu'il fournit des secondes décimales à très petite échelle. Pas beaucoup d'un programmeur/codeur, mais cela semble fonctionner.

Map of LA (Lower Alabama) with DMS (proper formatting)

+0

Merci @ C.Aldridge! Ça marche ;) –

0

utiliser la fonction dms du package GEOmap pour transformer degrés décimaux en degrés minutes secondes. La seule chose qui manque dans mon code est un moyen de coller les minutes dans les étiquettes d'axe.

bibliothèque (ggplot2) bibliothèque (ggmap) bibliothèque (GeoMap)

#get my map 
city<- get_map(location = c(lon= -54.847, lat= -22.25), 
       maptype = "satellite",zoom = 11,color="bw") 

map<-ggmap(city,extent="normal")+ 
    xlab("Longitude")+ ylab("Latitude") 

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(abs(dms(x)$d),"^o", "*W")), ifelse(x > 0, parse(text=paste0(abs(dms(x)$d),"^o", "*E")),abs(dms(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(abs(dms(x)$d),"^o", "*S")), ifelse(x > 0, parse(text=paste0(abs(dms(x)$d),"^o", "*N")),abs(dms(x)))))) 
    return(scale_y_continuous("Latitude", breaks = ybreaks, labels = ylabels, expand = c(0, 0), ...)) 
} 

map+ 
    scale_x_longitude(-55.0,-54.7,.1)+ 
    scale_y_latitude(-22.4,-22.1,.1)