2016-12-28 7 views
0

Мне нужно добавить шкалу масштаба к глобальной карте, сделанной в ggplot2 в R, а easiest way, казалось, через пакет ggsn.ggsn global map scale bar выглядит неправильно

Но шкала шкалы не выглядит правильной, когда я просматриваю карту - например, она составляет ~ 4000 км по всей Австралии по E-W и немного меньше, чем по всей Африке на экваторе. Масштабная шкала 2000 км выглядит шире, чем Африка на экваторе, и почти такая же широкая, как Австралия.

Спасибо за ваши мысли!

Возпроизводимо код:

library(ggplot2) 
library(ggsn) 
library(dplyr) 

GG.GlobalMap = map_data("world") %>% 
    filter(region != "Antarctica") 

ggplot(GG.GlobalMap, aes(long, lat, group = group)) + 
    geom_path(color = "black") + 
    scalebar(data = GG.GlobalMap, dist = 1000, dd2km = TRUE, model = "WGS84", 
      st.size = 3, location = "bottomright") + 
    theme_void() 
+0

Шкала масштаба довольно бессмысленна на глобальной карте, нарисованной в лат-длинной проекции, потому что расстояния сильно искажены широтой. лучше было бы нарисовать сетку, которая является предпочтительным методом для таких карт. Если вы действительно хотите шкалу шкалы, то используйте проекцию, которая близко сохраняет расстояния. см., например, https://en.wikipedia.org/wiki/List_of_map_projections – dww

+0

также относится: https://blogs.esri.com/esri/arcgis/2010/04/21/back-to-the-issue-of-scale-bars/ – dww

+0

Да, поэтому я также включил пример Африки вдоль экватора - расстояние, похоже, тоже не соответствует. –

ответ

1

В простом Lat длиной проекции вы используете, расстояния искажаются с широтой, становясь постепенно растягивается по мере приближения к полюсам. На полюсах одна точка растягивается до полной ширины прямоугольной карты. В результате не рекомендуется использовать шкалы на таких картах, потому что их размер будет правильным только на определенной широте и вводит в заблуждение всюду на карте. Мы можем увидеть это в действии, откладывая ряд масштабных баров на разных широтах, чтобы показать, как они различаются по размеру:

ggplot() + 
    geom_path(data = map_data("world"), aes(long, lat, group = group), color = "grey80") + 
    scalebar(dist = 1000, dd2km = TRUE, model = "WGS84", y.min = -80, y.max = 90, x.min = -180, x.max = 180, st.size = 2, location = "bottomright") + 
    scalebar(dist = 1000, dd2km = TRUE, model = "WGS84", y.min = -60, y.max = 90, x.min = -180, x.max = 180, st.size = 2, location = "bottomright") + 
    scalebar(dist = 1000, dd2km = TRUE, model = "WGS84", y.min = -40, y.max = 90, x.min = -180, x.max = 180, st.size = 2, location = "bottomright") + 
    scalebar(dist = 1000, dd2km = TRUE, model = "WGS84", y.min = -20, y.max = 90, x.min = -180, x.max = 180, st.size = 2, location = "bottomright") + 
    scalebar(dist = 1000, dd2km = TRUE, model = "WGS84", y.min = 0, y.max = 90, x.min = -180, x.max = 180, st.size = 2, location = "bottomright") + 
    scalebar(dist = 1000, dd2km = TRUE, model = "WGS84", y.min = 20, y.max = 90, x.min = -180, x.max = 180, st.size = 2, location = "bottomright") + 
    scalebar(dist = 1000, dd2km = TRUE, model = "WGS84", y.min = 40, y.max = 90, x.min = -180, x.max = 180, st.size = 2, location = "bottomright") + 
    scalebar(dist = 1000, dd2km = TRUE, model = "WGS84", y.min = 60, y.max = 90, x.min = -180, x.max = 180, st.size = 2, location = "bottomright") + 
    scalebar(dist = 1000, dd2km = TRUE, model = "WGS84", y.min = 80, y.max = 90, x.min = -180, x.max = 180, st.size = 2, location = "bottomright") + 
    theme_void() 

enter image description here

По этой причине, как правило, рекомендуется использовать координатную сетку, а чем шкалы шкалы на небольших глобальных картах.

ggplot() + 
    geom_path(data = map_data("world"), aes(long, lat, group = group), color = "black") + 
    scale_x_continuous(breaks = (-9:9)*20) + 
    scale_y_continuous(breaks = (-9:9)*10) + 
    theme_bw() + 
    theme(panel.grid.major = element_line(colour = 'grey50', size = 0.3, linetype = 3)) 

enter image description here

Если вы действительно хотите использовать масштабную линейку, вы должны сначала перепроецировать данные (с помощью spTransform) к проекции равных площадей, для которых расстояния искажаются только минимально или вообще не ,

+0

Спасибо за это объяснение. Я ошибочно предположил, что размер шкалы будет соответствовать расстоянию на экваторе. –