Подтвердить что ты не робот

Полигоны прекрасно обрезают ggplot2/ggmap при разных уровнях масштабирования

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

хороший пример, заслуживающий внимания, вот демонстрация проблемы:

#initialisation
library(ggmap)
require(MASS)

data(zips)

# overview
ggmap(get_map(maptype = "satellite", zoom = 8), extent = "device") +
        geom_polygon(aes(x = lon, y = lat, group = plotOrder),
                data = zips, colour = NA, fill = "red", alpha = .5) +
        geom_path(aes(x = lon, y = lat, group = plotOrder),
                data = zips, colour = "white", alpha = .7, size = .4)

# problematic view    
x11()
ggmap(get_map(maptype = "satellite", zoom = 12), extent = "device") +
        geom_polygon(aes(x = lon, y = lat, group = plotOrder),
                data = zips, colour = NA, fill = "red", alpha = .5) +
        geom_path(aes(x = lon, y = lat, group = plotOrder),
                data = zips, colour = "white", alpha = .7, size = .4)

Знаете ли вы о хорошем методе, чтобы правильно обрезать полигоны на границах границ границ графика? спасибо за помощь

Паскаль

4b9b3361

Ответ 1

Как правило, это отсечение происходит из-за масштабирования с использованием ограничений масштаба (которые выходят за пределы диапазона) по сравнению с использованием пределов координации (что является истинным масштабированием, просто рисуя детали внутри с частями вне диапазона, все еще там). ggmap не имеет прямого способа указывать, что должен использоваться второй тип зума, но, глядя на функцию, соответствующие части можно вытащить и снести вместе:

s12 <- get_map(maptype = "satellite", zoom = 12) 
ggmap(s12, base_layer=ggplot(aes(x=lon,y=lat), data=zips),
      extent = "normal", maprange=FALSE) +
    geom_polygon(aes(x = lon, y = lat, group = plotOrder),
                 data = zips, colour = NA, fill = "red", alpha = .5) +
    geom_path(aes(x = lon, y = lat, group = plotOrder),
              data = zips, colour = "white", alpha = .7, size = .4) +
    coord_map(projection="mercator", 
              xlim=c(attr(s12, "bb")$ll.lon, attr(s12, "bb")$ur.lon),
              ylim=c(attr(s12, "bb")$ll.lat, attr(s12, "bb")$ur.lat)) +
    theme_nothing()

enter image description here