2017-07-10 32 views
6

Pakiet wydaje się być bardziej przyjaznym dla użytkownika sposobem pracy z danymi przestrzennymi niż, powiedzmy, sp. Na przykład, jeśli mam zestaw współrzędnych szerokość/długość geograficzna, mogę wykreślić łatwo z wersji rozwojowej ggplot2:Dodawanie geomów ggplot2 do prostego wykresu funkcji

library(sf) 
devtools::install_github("tidyverse/ggplot2") 
library(ggplot2) 

# generate some data 
set.seed(123) 

y = rnorm(10, mean=40, sd=20) 
x = rnorm(10, mean=-100, sd=30) 

# collect to data.frame 
xy = data.frame(x=x,y=y) 

# create sf object 
xy.sf = sf::st_as_sf(xy, coords=c("x", "y"), crs=4269) 

# plot points 
ggplot(data=xy.sf) + geom_sf() 

Funkcja ggplot2::geom_sf wie, że geometria xy.sf obiektu jest zbiorem punktów, a więc don nie trzeba wywoływać, np. ggplot2::geom_point().

Załóżmy jednak, że chcę dodać kolejny geom w oparciu o zestaw punktów.

Na przykład, jeśli chcę, aby wygenerować warstwę konturu, aby pokazać, gdzie punkty są skoncentrowane, to użyłby ggplot2::geom_density2d lub ggplot2::stat_density2d, jak zasugerowano w this answer i this answer.

Jednakże następujący kod

ggplot(data=xy.sf) + 
    geom_sf() + 
    geom_density2d(data=xy.sf, aes(x=x,y=y,colour=..level..)) 

produkuje Poniższy obraz

test countour map

Zauważ, że linie Countour wydają się mieć współrzędne odwrócone!

Próbowałem bawić się powyższym kodem, ale nie mogę go uruchomić. Zdaję sobie sprawę, że pakiet sf jest dość nowy, ale mapa jest tak blisko, że ma rację! Jakieś pomysły?

Edit: Zapomniałem dodać info sesji

> sessionInfo() 
R version 3.4.0 (2017-04-21) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows 7 x64 (build 7601) Service Pack 1 

Matrix products: default 

locale: 
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252 
[3] LC_MONETARY=English_United States.1252 
[4] LC_NUMERIC=C       
[5] LC_TIME=English_United States.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] ggplot2_2.2.1.9000 sf_0.4-3   

loaded via a namespace (and not attached): 
[1] Rcpp_0.12.9  magrittr_1.5  maps_3.1.1  units_0.4-4  
[5] MASS_7.3-47  munsell_0.4.3  geosphere_1.5-5 colorspace_1.3-2 
[9] lattice_0.20-35 rjson_0.2.15  jpeg_0.1-8  rlang_0.1.1  
[13] stringr_1.2.0  udunits2_0.13  plyr_1.8.4  tools_3.4.0  
[17] rgdal_1.2-5  grid_3.4.0  gtable_0.2.0  png_0.1-7   
[21] DBI_0.5-1   ggthemes_3.3.0 lazyeval_0.2.0 assertthat_0.1 
[25] digest_0.6.12  tibble_1.3.1  ggmap_2.6.1  reshape2_1.4.2 
[29] mapproj_1.2-4  labeling_0.3  sp_1.2-4   stringi_1.1.2  
[33] compiler_3.4.0 RgoogleMaps_1.4.1 scales_0.4.1  proto_1.0.0 
+0

Otrzymuję "poprawny" wykres i nie mogę odtworzyć tego zachowania na OSX Sierra, R 3.4.0, ggplot2_2.2.1.9000 i sf_0.4-3. (Najnowsza wersja 'sf' to 0.5-1, ale wymaga GDAL 2.0 lub nowszego, którego jeszcze nie zainstalowałem.) – eipi10

+0

Otrzymuję również prawidłowy wykres, z 'sf' 0.5.1 – GGamba

+0

Po prostu uaktualniono do GDAL 2.2.0 i' sf' 0.5. 1. Nadal otrzymuję poprawną fabułę. Mogę jednak odtworzyć twój wykres, jeśli jawnie odwrócę współrzędne, tj. 'Geom_density2d (aes (x = y, y = x, color = .. level ..))'. – eipi10

Odpowiedz

1

Na przyszłość, pomyślałem, że pisać moje wyniki jako odpowiedź:

Okazuje się, że dodanie warstwy po geom_sf, np. geom_density2d, nie dziedziczy estetyki mapowania zastosowanej do geom_sf.

Zauważ, że to działa zgodnie z oczekiwaniami:

ggplot(data=xy.sf, aes(x=x, y=y)) + 
    geom_sf() + 
    geom_density2d(aes(colour=..level..)) 

ale tylko dlatego x,y istnieją jako obiekty oddzielny z xy.sf.

Zatem po zgłasza błąd:

rm(x,y) 
ggplot(data=xy.sf, aes(x=x, y=y)) + 
    geom_sf() + 
    geom_density2d(aes(colour=..level..)) 

Error in FUN(X[[i]], ...) : object 'x' not found

Oczywiście, to można znaleźć w documentation!

" geom_sf uses a unique aesthetic: geometry ... Unlike other aesthetics, geometry will never be inherited from the plot."

więc obejście znalazłem jest użycie x,y samych przedmiotów lub czystego data.frame wersji obiektu sf; np. geom_density2d(data=xy, aes(x,y,colour=..level..)).