2015-10-23 9 views
7

ich eine ggplot Karte habe, zum Beispiel: im obigen Fall, zum Beispiel:Format Breiten- und Längenachsenbeschriftungen in ggplot

library(ggmap) 
ggmap(get_map()) 

Ich würde die Achsenbeschriftungen wie automatisch als NS/WE gekennzeichnet werden anstelle von lon -95,4 sollte es 95,4 ° E anzeigen.

Ich habe versucht, zu Chaos mit dem scales Paket und mit scale_x_continuous und scale_y_continuous Etiketten und Pausen Optionen, aber ich habe es nicht geschafft, damit es funktioniert.

Es wäre toll, eine scale_y_latitude und scale_x_longitude zu haben.

EDIT: Dank @Jaap ‚s Antwort, die ich auf die folgende bekam:

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

was ziemlich gut funktioniert. Aber aus irgendeinem Grund scheint mein R das Gradsymbol vor dem Hauptpunkt nicht zu mögen ... Es wird als ein einfacher Punkt angezeigt, z. Länge -24 wird 24..W

Antwort

12

Leider gibt es noch keine scale_x_longitude oder scale_y_latitude. In der Zwischenzeit ist hier eine Abhilfe, in dem Sie die Etiketten vorher angeben:

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

die gibt:

enter image description here


Um die Grade in den Funktionen, können Sie die o erhöhen als hochgestellt (was die Notwendigkeit eines speziellen Symbols umgeht):

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

, die die folgende Karte gibt:

enter image description here

Ich benutzte geom_blank nur den gewünschten Effekt zu veranschaulichen. Sie können natürlich auch andere Geom verwenden (z. B. geom_point), um Ihre Daten auf der Karte zu plotten.

+0

Die Antwort ist sehr gut, danke, aber ich werde es nicht als akzeptiert markieren, da ich nach einem automatisierten Ansatz suche, zum Beispiel wenn ich 'library (scales) mache; p + scale_y_continuous (labels = percent) '(siehe http://docs.ggplot2.org/current/scale_continuous.html) ... Übrigens scheint mein R das Gradsymbol in" ° E "nicht zu mögen. .. es wird aus irgendeinem Grund nicht richtig wiedergegeben. Ideen? – AF7

+0

@ AF7 Ich glaube, ich habe eine Lösung für das Gradsymbol gefunden. Siehe das Update. – Jaap

+0

Danke, das sieht nach einer guten Lösung aus. – AF7