2015-10-23 30 views
7

Tôi có một bản đồ ggplot, ví dụ:Format vĩ độ và kinh độ trục nhãn trong ggplot

library(ggmap) 
ggmap(get_map()) 

Tôi muốn các nhãn trục được tự động dán nhãn là NS/CHÚNG TÔI: trong trường hợp trên, ví dụ , thay vì lon -95.4, nó sẽ hiển thị 95,4 ° E.

Tôi đã cố gắng gây rối với gói scales và sử dụng scale_x_continuousscale_y_continuous tùy chọn nhãn và ngắt, nhưng tôi đã không quản lý để làm cho nó hoạt động.

Thật tuyệt vời khi có một số scale_y_latitudescale_x_longitude.

EDIT: Nhờ câu trả lời @Jaap 's tôi như sau:

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

Những hoạt động khá tốt. Nhưng vì lý do nào đó R của tôi dường như không thích biểu tượng độ ở phía trước điểm hồng y ... Nó được hiển thị dưới dạng một chấm đơn giản, ví dụ: kinh độ -24 trở thành 24..W

Trả lời

12

Thật không may, không có điều nào như scale_x_longitude hoặc scale_y_latitude. Trong khi đó, đây là một cách giải quyết khác mà bạn chỉ định các nhãn trước:

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

mang đến cho:

enter image description here


Để có được độ trong các chức năng, bạn có thể nâng cao o dưới dạng siêu văn bản (sẽ phá vỡ sự cần thiết của một biểu tượng đặc biệt):

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

mà đưa ra sơ đồ sau:

enter image description here

tôi đã sử dụng geom_blank chỉ để minh họa cho hiệu quả mong muốn. Bạn có thể tắt khóa học sử dụng geom khác (ví dụ: geom_point) để vẽ dữ liệu của bạn trên bản đồ.

+0

Câu trả lời rất tốt, cảm ơn, nhưng tôi không đánh dấu nó là được chấp nhận vì tôi đang tìm cách tiếp cận tự động, chẳng hạn như khi thực hiện 'thư viện (cân); p + scale_y_continuous (nhãn = phần trăm) '(xem http://docs.ggplot2.org/current/scale_continuous.html) ... bằng cách R của tôi dường như không thích biểu tượng độ trong" ° E ". .. nó không được hiển thị chính xác vì một số lý do. Ý tưởng? – AF7

+0

@ AF7 Tôi nghĩ rằng tôi đã tìm thấy giải pháp cho biểu tượng độ. Xem bản cập nhật. – Jaap

+0

Cảm ơn bạn, trông giống như một giải pháp tốt. – AF7

Các vấn đề liên quan