Interaktywna kula ziemska o wyrafinowanym wyglądzie

“Wspomóż rozwój naszego Bloga. Kliknij w Reklamę. Nic nie tracisz a zyskujesz  naszą wdzięczność … oraz lepsze, ciekawsze TEKSTY. Dziękujemy”

Aby zakończyć tą część, zbudujemy interaktywny globus o nowoczesnym wyglądzie, po którym będziesz mógł się poruszać i pokazywać znajomym. Tego typu wizualizacje zwykle nie są zbyt przydatne do analizy, ale są fajne!

Naszym celem jest pokazanie kuli ziemskiej, na której będą wyświetlane dane geograficzne pochodzące z wiadomości klientów, a także słupki, których wysokość reprezentuje PROFIT związane z każdą sprzedażą i kolory dla PROTEIN_SOURCE. Aby to osiągnąć, użyjemy pakietu threejs. Tak jak wcześniej, nasza funkcja graph_client_message_in_globe() otrzymuje dane client_messages i sales i konfiguruje je za pomocą funkcji setup_globe_data(). Następnie pobierze świat data za pomocą funkcji get_world_map_data() i dołącz go do ramki danych data za pomocą funkcji rbins.fill() z pakietu plyr. Ta funkcja przypomina funkcję R, rbind() ale nie będzie narzekać, jeśli kolumny nie będą zgodne. Zamiast tego wypełni puste wartości wskaźnikami brakujących danych. Na koniec zwracamy obiekt globusa z funkcją globejs(), która otrzymuje współrzędne w lat i long, wysokość słupka pod parametrem val, która pochodzi ze zmiennej PROFIT, color która pochodzi ze zmiennej COLOR utworzonej podczas konfiguracji danych (patrz poniższy przykład), a parametr atmosphere = TRUE pokazujący świecący efekt na całym świecie:

graph_client_messages_in_globe <- funtion(client_messages , sales) {

data <- setup_globe_data(client_messages, sales)

world_map <- get_world_map_data()

data <- rbind.fill(data, world_map_

return(globejs )

lat = data$LAT,

long = data$LNG,

val = data$PROFIT ^1.2,

color = data$COLOR,

pointsize = 1,

artmosphere = TRUE

))

}

Funkcja setuop_globe_data() wykonuje standardowe scalenie, które zrobiliśmy ze wszystkimi mapami i dodaje nową zmienną o nazwie COLOR, która zawiera kolory, które powinny być użyte dla każdej obserwacji. W przypadku pakietu ggplot2 to przypisanie koloru zostało zrobione za nas automatycznie, ale w pakiecie threejs musimy to zrobić sami. Będzie to po prostu inny kolor dla każdej wartości w zmiennej PROTEIN_SOURCE:

setup_globe_data <- function(lient_messages, sales) {

data <- merge (

clinet_messages,

sales,

„SALE_ID”,

all.x = TRUE,

all.y = FALSE

)

data$COLOR <- NA

data[data$PROTEIN_SOURCE ==”BEEF”, „COLOR”] <- „#aaff00”

data[data$PROTEIN_SOURCE ==”FISH, „COLOR”] <- „#00ffaa”

data[data$PROTEIN_SOURCE ==”CHICKEN”, „COLOR”] <- „#00aaff”

data[data$PROTEIN_SOURCE ==”VEGETARIA”, „COLOR”] <- „#0055ff”

return(data)

}

Funkcja get_world_mapdata() jest nieco skomplikowana. Jeśli nie rozumiesz, jak to działa, nie martw się zbytnio, ponieważ prawdopodobnie nie będziesz musiał tego robić samodzielnie. Nie możemy po prostu wykorzystać danych, których używaliśmy wcześniej do tworzenia map, które utworzyliśmy za pomocą funkcji map_data(), ponieważ wymagana struktura danych jest inna. W takim przypadku utworzymy plik tymczasowy o nazwie cache z funkcją tempfile(). Następnie odczytamy plik binarny pochodzący z adresu URL z funkcjami url() i readBi(). Plik jest plikiem TIFF, który otwieramy w formacie „raw”, aby zachować wszystkie dane w niezmienionej postaci i uniknąć jakiejkolwiek interpretacji danych w R. Parametr n to maksymalna liczba rekordów do odczytania z danych, która w tym przypadku wynosi 1 milion. Następnie wysyłamy te dane za pomocą funkcji writeBin(), aby zostały zapisane w pliku cache, który utworzyliśmy wcześniej. Ten mechanizm to sposób na pobranie niektórych danych tymczasowych, abyśmy mogli je wczytać do funkcji, która nie obsługuje odczytu z zasobów online. Gdy mamy gotowy plik tymczasowy, czytamy go funkcją readGDAL() z pakietu rgdal t, który odczyta go jako dane geograficzne. Konkretny format tych danych obejmuje długość i szerokość geograficzną oraz metrykę wysokości. Metryka wysokości służy do identyfikacji obszarów bez lądu (oceanów), które zawierają w tych danych wartość wyższą lub równą 255. Kontynuujemy usuwanie wszelkich wartości NA z danych i przypisywanie domyślnych wartości PROFIT  i COLOR. Zwróć uwagę, że tworzymy te wartości PROFIT i COLOR, aby ułatwić późniejsze scalanie danych. Używamy nazwy kolumny PROFIT dla metryki wysokości tylko dla wygody, ponieważ będziemy chcieli pokazać obszary geograficzne z niskimi słupkami i wiemy, że użyjemy PROFIT do wygenerowania wysokości dla każdego słupka:

get_world_map_data <- function () {

cache <- tempfile()

writeBin(readBin(url(

„http://illposed.net/nyr2015/MOD13A2_E_NDVI_2014-05025_rgb_360x180.TIFF”, open = „rb”),

what = „raw” ,  = 1e6), con – cache)

world_map <- readGDAL(cache)

world_map <- as.data.frame(cbind(coordinates(world_map),

world_map@data[,1]))

names(world_map) <- c(„LNG”, „LAT”, „PROFIT”)

world_map <- world_mp[world_map$PROFIT < 255,]

world_map <- na.exclude(world_map)

world_map$PROFIT <- 1

world_map$COLOR <- #0055ff”

retur(world_map)

}

Kiedy zainwestowaliśmy w tworzenie naszej funkcji wykresu, możemy tworzyć zaawansowane technicznie mapy, które pokazują lokalizację wiadomości otrzymywanych od naszych klientów, z paskami i kolorami wskazującymi powiązane PROFIT i PROTEIN_SOURCE odpowiednio dla każdej wiadomości. Zapraszam do poruszania się po świecie w przeglądarce internetowej:

graph_client_messages_in_globe(cliet_messages, sales)

To całkiem fajny efekt, prawda?

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *