Coropletas em R: pausas e plotagem personalizadas

13

Eu tenho uma pergunta em relação à plotagem de um mapa de coropletas. O que é recomendado em relação à plotagem de um mapa com quebras personalizadas? E faça com que pareça um pouco atraente.

No meu script , usei o comando plot e spplot para visualizar alguns dados, mas não estou totalmente satisfeito com o resultado. É fácil ver porque. Usando spplot , recebo uma rampa de cores que repete cores para valores diferentes, o que é um pouco estranho. Usando a plotagem com as quebras personalizadas , não pude fazer melhores intervalos para os valores, de modo que, por exemplo, os valores zero sejam brancos no mapa. As proporções distorcidas entre legenda e mapa são provavelmente o resultado do Rstudio.

Então, eu me perguntei se alguém teria melhores sugestões para plotar mapas de coropletas no R usando pausas personalizadas?

EDIT 20-02-2013

Como sugerido, usei o ggplot2 para criar um mapa de choropleth. Eu usei o código abaixo. Eu encontrei dois problemas. Uma é que, após a fortificação dos dados, nem todos os dados do shapefile são transferidos para o quadro de dados. Então eu tenho que renomear a variável "id" para que eu possa mesclar os dados. Problema menor.

Um problema maior é que, apesar dos dados no quadro de dados estarem corretos, o ggplot mostra um mapa em que os dados estão incorretos. O valor da cor de acordo com a legenda não corresponde ao valor da variável nos dados. Estou negligenciando algo aqui?

# 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 para dados de replicação

Atualização 13-11-2015: link corrigido para o arquivo de forma . Consulte a resposta abaixo para obter uma solução sobre como plotar o coropleta.

horseoftheyear
fonte
5
Eu também analisaria o uso ggplot2de mapas choropleth, que, por padrão, resultam em uma melhor aparência.
SlowLearner 17/02
Sim, eu não tinha certeza sobre o uso do ggplot2, pois os dados long / lat no meu shapefile apenas especificam um ponto e não o contorno das fronteiras nacionais. Portanto, usei esses gráficos para criar um mapa de coropletas. Eu não estou muito familiarizado com o tratamento de dados GIS no R, por isso não tenho certeza se estou ignorando alguma solução realmente direta para isso.
horseoftheyear
Por favor, corrija o link para o shapefile.
baiacu
Claro, sem problemas.
horseoftheyear

Respostas:

6

Não vejo problema com o código acima, exceto que você possui 6 níveis claros onset, portanto, eu os trataria como fatores, e não como uma variável contínua. Observe a factorchamada no código abaixo.

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

Esse código fornece o seguinte resultado:

original

Se você quiser cores personalizadas, tente o seguinte:

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()

O que produz isso:

cores personalizadas

Aprendiz lento
fonte
Ainda plota os valores errados. Muito peculiar.
horseoftheyear
OK, você pode especificar exatamente qual é o problema, com exemplos? Angola é atribuído a 3para a onsetcoluna e plota a 3no gráfico. Isso parece funcionar. Presumivelmente, estou perdendo alguma coisa?
SlowLearner
Ow sim desculpe. Angola é uma das poucas que está correta. Se você observar África do Sul, Namíbia ou Senegal, por exemplo, verá que o valor indicado pela cor não corresponde ao valor dos dados. Portanto, o Senegal deve ser um 6 (agora 2), a África do Sul 0 (4) e a Namíbia também 0 (1). Burundi e Ruanda também estão fora para citar alguns outros. No link, um gráfico que fiz com o spplot, que mostra um mapa com os valores corretos. Este gráfico é feito diretamente do shapefile. Então, acho que algo dá errado na criação do quadro de dados.
horseoftheyear
5

O pacote classInt possui várias funções para calcular intervalos para dados numéricos - instale-o e leia os documentos.

Spacedman
fonte
Sim, usei o pacote classInt com quebras fixas (não mostradas no script), mas o problema é que ele calcula intervalos para dados numéricos contínuos. Enquanto meus intervalos são discretos, eles representam uma frequência de eventos. Ainda não descobrimos como melhorar isso.
Horseoftheyear
1

Para os arquivos, a solução que usei:

#### 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)))

insira a descrição da imagem aqui

horseoftheyear
fonte
Há um pacote para R que oferece funcionalidade de mapeamento útil. É chamado de cartografia (e notavelmente permite coroar mapas de acordo com a documentação). Desculpe se está fora do tópico (como você já encontrou sua resposta), mas digamos que seja para referência futura ..!
mgc 13/11/2015
Isso parece muito bom. Certamente tentarei outro trabalho, então obrigado pela referência.
Horseoftheyear