Choropleth in R: niestandardowe przerwy i spiski

13

Mam pytanie dotyczące nakreślenia mapy choropleth. Co jest zalecane w odniesieniu do kreślenia mapy z niestandardowymi przerwami? I spraw, aby wyglądał nieco atrakcyjnie.

W moim skrypcie użyłem polecenia plot i spplot do wizualizacji niektórych danych, ale nie jestem do końca zadowolony z wyniku. Łatwo zrozumieć, dlaczego. Za pomocą splotu otrzymuję rampę kolorów, która powtarza kolory dla różnych wartości, co jest nieco dziwne. Używając wykresu z niestandardowymi podziałami , nie byłem w stanie uzyskać lepszych przedziałów dla wartości, tak że na przykład wartości zerowe są białe na mapie. Przekrzywione proporcje między legendą a mapą są, jak sądzę, prawdopodobnie wynikiem Rstudio.

Zastanawiałem się więc, czy ktoś ma lepsze sugestie dotyczące tworzenia map choropleth w R przy użyciu niestandardowych przerw?

EDYCJA 20-02-2013

Zgodnie z sugestią użyłem ggplot2 do stworzenia mapy choropleth. Użyłem kodu poniżej. Napotkałem dwa problemy. Jednym z nich jest to, że po wzmocnieniu danych nie wszystkie dane z pliku kształtu są przesyłane do ramki danych. Więc muszę zmienić nazwę zmiennej „id”, aby móc scalić dane. Mniejszy problem.

Większy problem polega na tym, że pomimo faktu, że dane w ramce danych są poprawne, ggplot pokazuje mapę, w której dane są niepoprawne. Wartość koloru zgodnie z legendą nie odpowiada wartości zmiennej w danych. Czy coś tutaj przeoczyłem?

# Plotting polygon shapefiles (try-out)
# Load the packages
require(rgdal)
require(maptools)
require(ggplot2)
gpclibPermit() # required for the fortify method
# Load the shapefile
africa=readOGR("/home/GIS",layer="africaII")
names(africa) 
# Load the data on conflict
conflict<-read.csv("africa_conflict.csv", header=TRUE)
names(conflict)
# Merge the data together
africadat<-merge(africa, conflict, by="ISO3")
# Changing the data in the shapefile
africa@data <- africadat
# Fortify so that ggplot can plot
africa.points = fortify(africa,region="ISO3")
# Change "id" to "ISO3"such that the datasets can be merged again
names(africa.points)[names(africa.points)=="id"]<-"ISO3"
africa.df=merge(africa.points,africadat,by="ISO3")
# Plot the data
ggplot(africa.df) + 
aes(long,lat,group=group) + 
geom_polygon(aes(fill =onset))+
geom_path(color="white") +
coord_equal()

Link do danych replikacji

Aktualizacja 13-11-2015: Naprawiono link do pliku kształtu . Zobacz odpowiedź poniżej, aby dowiedzieć się, jak zaplanować choropleth.

rok
źródło
5
Chciałbym również użyć ggplot2map choropleth, które moim zdaniem domyślnie okazują się lepiej wyglądające.
SlowLearner
Tak, nie byłem pewien użycia ggplot2, ponieważ dane long / lat w moim pliku kształtu określają tylko punkt, a nie kontur granic państwowych. Dlatego użyłem tych wykresów do stworzenia mapy choropleth. Nie jestem zbyt obeznany z obsługą danych GIS w R, więc nie jestem pewien, czy przeoczę jakieś naprawdę proste rozwiązanie tego problemu.
horseoftheyear
Popraw link do pliku shapefile.
pufferfish,
Pewnie nie ma problemu.
horseoftheyear

Odpowiedzi:

6

Nie widzę problemu z powyższym kodem, z wyjątkiem tego, że masz 6 wyraźnych poziomów onset, więc potraktowałbym je jako czynniki, a nie jako zmienną ciągłą. Zanotuj factorpołączenie w poniższym kodzie.

ggplot(africa.df) +
  aes(long,lat,group=group) +
  geom_polygon(aes(fill = factor(onset)))+
  geom_path(color="white") +
  coord_equal()

Ten kod daje następujący wynik:

oryginalny

Jeśli chcesz niestandardowe kolory, możesz spróbować:

library(RColorBrewer)
my.cols <- brewer.pal(6, "Blues")

ggplot(africa.df) +
  aes(long,lat,group=group) +
  geom_polygon(aes(fill = factor(onset)))+
  scale_fill_manual("Onset\n", values = my.cols, guide = "legend") +
  geom_path(color="white") +
  coord_equal()

Co powoduje:

niestandardowe kolory

SlowLearner
źródło
Nadal jednak wykreśla nieprawidłowe wartości. Bardzo osobliwy.
Horseoftheyear
OK, czy możesz dokładnie określić, na czym polega problem, z przykładami? Angola ma przypisany „a” 3do onsetkolumny i kreśli „a” 3na wykresie. To wydaje się działać. Prawdopodobnie coś mi umknęło?
SlowLearner
O tak przepraszam. Angola jest jedną z niewielu, która jest poprawna. Jeśli na przykład spojrzysz na RPA, Namibię lub Senegal, zobaczysz, że wartość wskazana kolorem nie odpowiada wartości w danych. Senegal powinien więc mieć 6 (obecnie 2), RPA 0 (4), a Namibia także 0 (1). Burundi i Rwanda wymieniają też kilka innych. W linku utworzyłem wykres z splotem, który pokazuje mapę z prawidłowymi wartościami. Ten wykres jest wykonywany bezpośrednio z pliku kształtu. Myślę, że coś idzie nie tak z tworzeniem ramki danych.
Horseoftheyear
5

Pakiet classInt ma wiele funkcji do obliczania interwałów dla danych liczbowych - zainstaluj go i przeczytaj dokumenty.

Spacedman
źródło
Tak, użyłem pakietu classInt ze stałymi podziałami (nie pokazanymi w skrypcie), ale problem polega na tym, że oblicza interwały dla ciągłych danych liczbowych. Podczas gdy moje interwały są dyskretne, reprezentują one częstotliwość zdarzeń. Nie dowiedziałem się jeszcze, jak to poprawić.
horseoftheyear
1

W przypadku archiwów zastosowałem rozwiązanie:

#### Choropleth in R example ####

## Libraries
library(classInt)    
library(lattice)
library(RColorBrewer)    
library(sp)

## Shapefile for Sub-Sahara Africa (see link in Q)
africa<-readShapeSpatial("shp/africa.shp") 

## Add data to shapefile
# In this case the number of conflict onsets between 1981-2010
africa$onset<-c(3,0,3,1,3,1,4,2,3,0,
                2,0,3,1,1,0,2,1,1,1,
                2,0,3,0,1,0,0,4,2,1,
                3,0,1,0,6,1,3,1,1,0,
                0,1,1,0,0,0,0)

## Plot 
par(mar=c(1,4,1,1),family="serif")
trellis.par.set(axis.line=list(col=NA)) # Remove borders
spplot(africa,zcol="onset",col.regions=colorRampPalette(c("white","grey10"))(20),
main=list(label="Number of civil conflict onsets 1981-2010",cex=3),
pretty=T,par.settings=list(axis.text=list(cex=3)))

wprowadź opis zdjęcia tutaj

rok
źródło
Istnieje pakiet dla R, który oferuje przydatne funkcje mapowania. Nazywa się to kartografią (w szczególności pozwala na mapowanie choropletów zgodnie z dokumentacją). Przepraszam, jeśli jest nie na temat (jak już znalazłeś swoją odpowiedź), ale powiedzmy, że będzie w przyszłości.!
mgc
To ładnie wygląda. Na pewno spróbuję innej pracy, więc dziękuję za referencje.
horseoftheyear