Отформатируйте метки широты и долготы в ggplot
У меня есть карта ggplot, например:
library(ggmap)
ggmap(get_map())
Мне бы хотелось, чтобы метки оси были автоматически помечены как NS / WE: в приведенном выше случае, например, вместо lon -95.4 он должен показывать 95.4°E.
Я пытался связываться с scales
пакет и использование scale_x_continuous
а также scale_y_continuous
варианты ярлыков и разрывов, но мне не удалось заставить его работать.
Было бы здорово иметь scale_y_latitude
а также scale_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
2 ответа
К сожалению, такого понятия, как scale_x_longitude
или же 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
как верхний индекс (который обойдет необходимость в специальном символе):
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
просто чтобы проиллюстрировать желаемый эффект. Вы можете, конечно, использовать другие геом (например, geom_point
) нанести ваши данные на карту.
Теперь вы можете использовать пакет metR .В нем естьscale_*_latitude()
иscale_*_longitude()
функции.
# load the needed libraries
library(ggplot2)
library(ggmap)
library(metR) #new package
# get the map
m <- get_map(location=c(lon=0,lat=0),zoom=5)
# create the map
ggmap(m) +
scale_x_longitude(breaks = seq(-10,10,5)) +
scale_y_latitude(breaks = seq(-10,10,5))
#> Scale for x is already present.
#> Adding another scale for x, which will replace the existing scale.
#> Scale for y is already present.
#> Adding another scale for y, which will replace the existing scale.
Создано 28 ноября 2022 г. с репрексом v2.0.2