Generowanie atrakcyjnych wizualnie map ciepła gęstości w R.

27

Chociaż wiem, że istnieje szereg funkcji do generowania map ciepła w R, problem polega na tym, że nie jestem w stanie stworzyć atrakcyjnych wizualnie map. Na przykład poniższe zdjęcia to dobre przykłady map cieplnych, których chcę unikać. Pierwszy wyraźnie nie zawiera szczegółów, podczas gdy drugi (oparty na tych samych punktach) jest zbyt szczegółowy, aby był użyteczny. Oba wykresy zostały wygenerowane przez funkcję gęstości () w pakiecie spatstat R.

Jak mogę uzyskać więcej „przepływu” na moje wykresy? Moim celem jest raczej wygląd wyników komercyjnego oprogramowania SpatialKey ( zrzut ekranu ).

Jakieś wskazówki, algorytmy, pakiety lub wiersze kodu, które mogłyby mnie poprowadzić w tym kierunku?

wprowadź opis zdjęcia tutaj

Figaro
źródło
czy spojrzałeś na funkcję image ()? Zwiększenie liczby przerw zwiększa rozdzielczość.
Makro

Odpowiedzi:

28

Istnieją dwie rzeczy, które wpłyną na gładkość wydruku, szerokość pasma wykorzystywana do oszacowania gęstości jądra oraz przerwy, którym przypisujesz kolory na wykresie.

Z mojego doświadczenia wynika, że ​​do analizy eksploracyjnej po prostu dostosowuję przepustowość, aż otrzymam użyteczny wykres. Pokaz poniżej.

library(spatstat)
set.seed(3)
X <- rpoispp(10)
par(mfrow = c(2,2))
plot(density(X, 1))
plot(density(X, 0.1))
plot(density(X, 0.05))
plot(density(X, 0.01))

wprowadź opis zdjęcia tutaj

Po prostu zmiana domyślnego schematu kolorów nie pomoże, podobnie jak zmiana rozdzielczości pikseli (jeśli w ogóle domyślna rozdzielczość jest zbyt precyzyjna, należy zmniejszyć rozdzielczość i powiększyć piksele). Chociaż możesz chcieć zmienić domyślny schemat kolorów ze względów estetycznych, ma on być bardzo dyskryminujący.

Aby pomóc w kolorze, zmień poziom skali na logarytmy (naprawdę pomoże tylko w przypadku bardzo niejednorodnego procesu), zmień paletę kolorów, aby bardziej różnić się w dolnej części (odchylenie w zakresie specyfikacji rampy kolorów w R) lub dostosuj legendę, aby mieć dyskretne pojemniki zamiast ciągłego.

Przykłady stronniczości w legendzie zaadaptowanej stąd , a ja mam inny post na stronie GIS wyjaśniający kolorowanie dyskretnych pojemników w dość prostym przykładzie tutaj . Nie pomoże to jednak, jeśli wzór jest wygładzony lub wygładzony na początek.

Z <- density(X, 0.1)
logZ <- eval.im(log(Z))
bias_palette <- colorRampPalette(c("blue", "magenta", "red", "yellow", "white"), bias=2, space="Lab")
norm_palette <- colorRampPalette(c("white","red"))
par(mfrow = c(2,2))
plot(Z)
plot(logZ)
plot(Z, col=bias_palette(256))
plot(Z, col=norm_palette(5))

wprowadź opis zdjęcia tutaj


Aby kolory były przezroczyste na ostatnim obrazie (gdzie pierwszy pojemnik kolorów jest biały), wystarczy wygenerować rampę kolorów, a następnie zastąpić specyfikację RGB przezroczystymi kolorami. Przykład poniżej z wykorzystaniem tych samych danych, co powyżej.

library(spatstat)
set.seed(3)
X <- rpoispp(10)
Z <- density(X, 0.1)
A <- rpoispp(100) #points other places than density


norm_palette <- colorRampPalette(c("white","red"))
pal_opaque <- norm_palette(5)
pal_trans <- norm_palette(5)
pal_trans[1] <- "#FFFFFF00" #was originally "#FFFFFF" 

par(mfrow = c(1,3))
plot(A, Main = "Opaque Density")
plot(Z, add=T, col = pal_opaque)
plot(A, Main = "Transparent Density")
plot(Z, add=T, col = pal_trans)


pal_trans2 <- paste(pal_opaque,"50",sep = "")
plot(A, Main = "All slightly transparent")
plot(Z, add=T, col = pal_trans2)

wprowadź opis zdjęcia tutaj

Andy W.
źródło
Dziękuję, bardzo wyraźnie urażona odpowiedź. To w połączeniu z poleceniem „spatstat.options (npixel = c (100,100))”, które podałeś, aby załatwić sprawę. Jeśli mogę ci jeszcze trochę niepokoić: Czy wiesz, jak mogę sprawić, by kolor tła był przezroczysty?
Figaro
1
@Figaro, zaktualizowałem o przykład uczynienia kolorów półprzezroczystymi.
Andy W
Dziękuję Ci. Jeszcze jedna rzecz. Chociaż może to być nieco nie na temat: Jak wyeksportować te mapy cieplne do pliku Shape? Czy też muszę traktować je tylko jako rastry?
Figaro
Nigdy nie musiałem tego robić, więc nie mogę powiedzieć od razu. Prawdopodobnie dobre pytanie dla guru R o przepełnieniu stosu.
Andy W
Czy mapę termiczną można przedstawić jako coś innego niż raster?
Figaro
2

Możesz skorzystać z funkcji interp z pakietu akima. Umożliwi to interpolację macierzy do innej rozdzielczości, jeśli zajdzie taka potrzeba. Aby stworzyć coś w rodzaju połączonego przykładu, trzeba interpolować do całkiem dobrej siatki (być może z argumentami xo i yo o długości ~ 1000). Otrzymasz nową matrycę, którą możesz wydrukować za pomocą image (). Jeśli potrzebujesz przejrzystości, zajmie to trochę dodatkowej pracy. Nie jest to łatwe z paletą kolorów, więc może być konieczne wydrukowanie każdej siatki jako wielokąta z przypisanym kolorem.

Marc w pudełku
źródło
Czy masz doświadczenie w tworzeniu przezroczystości? Czy są przykłady? To byłby następny krok.
Figaro
Jak utworzyć wartości x, y, z potrzebne dla interp ()? Na przykład, jeśli gęstość () wykorzystuje siatkę 100 x 100, mam wartości z dla każdego punktu, ale nie mam xiy w wymaganym formacie wektorowym (mam tylko współrzędne osi).
Figaro
Wykonano pętlę, aby uzyskać pary współrzędnych, ale czy jest do tego funkcja?
Figaro
2
Wygląda na to, że obraz w końcu akceptuje przezroczyste kolory. Zobacz: menugget.blogspot.de/2012/04/… . Jeśli nadal chcesz używać interp, możesz wygenerować kombinacje współrzędnych xy dla poziomów z za pomocą: „grid <- expand.grid (x = x, y = y)”
Marc w polu
1

Możesz zajrzeć do ggplot2. Wygląda na to, że pakiet, który wypróbowałeś, nie ma świetnych schematów kolorów lub „przepływu” - spójrz na RColorBrewer. Istnieje blog, na którym zaimplementował ten pakiet z prostym przykładem.

Nie jestem pewien, czy próbujesz wykreślić dane geograficzne, jak pokazano w połączonym przykładzie, ale jeśli tak, wiem, że Google oferuje „Static Maps API V2 Developer Guide” i możesz połączyć Google i R z pakietem o nazwie RgoogleMaps .

Powodzenia w twoich badaniach.

Rozpoznać
źródło
Przepraszam, gdybym był niejasny, ale w tej chwili problemem nie jest sam schemat kolorów. Jednak dzisiaj wypróbowałem RColorBrewer: świetny mały pacakge! To dane przestrzenne, nie jestem pewien, czy chcę korzystać z interfejsów API Google, ale mogę rzucić okiem.
Figaro
0

Czy próbowałeś zwiększyć rozdzielczość density? Spróbuj argumentować dimyx=c(512, 512)lub wyżej.

Wayne
źródło