在ggplot中格式化纬度和经度轴标签

时间:2015-10-23 12:31:45

标签: r ggplot2 latitude-longitude axis-labels ggmap

我有一个ggplot地图,例如:

library(ggmap)
ggmap(get_map())

我希望轴标签自动标记为N-S / W-E:例如,在上述情况下,代替lon -95.4,它应显示95.4°E。

我试图弄乱scales包并使用scale_x_continuousscale_y_continuous标签并打破选项,但我还没有设法让它发挥作用。

拥有scale_y_latitudescale_x_longitude

会很棒

编辑: 感谢@Jaap的回答,我得到了以下内容:

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

哪个效果很好。但由于某些原因,我的R似乎不喜欢基点前面的度数符号......它显示为一个简单的点,例如经度-24变为24..W

1 个答案:

答案 0 :(得分:14)

不幸的是,还没有scale_y_latitude# 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)) 这样的事情。与此同时,这是一个预先指定标签的解决方法:

o

给出:

enter image description here

要获得函数中的度数,可以将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)) 作为上标(这将绕过对特殊符号的需要):

geom_blank

给出了以下地图:

enter image description here

我使用geom_point来说明所需的效果。您当然可以使用其他geom(例如memcached -vv)在地图上绘制数据。