Redistribución da poboación en Galicia: 1900-2011

10:39 3 Comentarios




(pulsa na animación para vela a tamaño completo)


A animación foi realizada con R e ImageMagick. Os datos de partida foron un mapa vectorial dos concellos de Galicia e datos históricos de censo de poboación (accesibles no Instituto Nacional de Estadística)

Despois de introducidos, os datos tiñan este aspecto:

head(poboacion)
  codigoine concello X1900 X1910 X1920 X1930 X1940 X1950 X1960 X1970 X1981 X1991 X2001 X2011 sup1996
1     15001 Abegondo  7376  7604  7776  8238  8890  8202  7335  6302  5912  5448  5729  5699    83.9
2     15002     Ames  7097  7271  7334  7602  9153  9425  9597  9833  9166  9864 18782 29106    80.0
3     15003   Aranga  4710  4512  4673  4980  5005  4618  4072  3187  2685  2490  2314  2070   119.6
4     15004     Ares  4209  4537  4488  4850  5671  4724  5033  5042  4529  4447  5003  5774    18.3
5     15005  Arteixo  9629  9539  9304  9905 10528 10471 10887 12166 15268 17934 23306 30630    93.4
6     15006    Arzúa  9036  8708  8722  8743 10396 10754 10470  9064  6999  6932  6633  6304   155.4

Creamos tamén unha táboa de datos coa densidade de poboación en cada ano, e unha táboa adicional co logaritmo da anterior

densidade <- poboacion[,3:14] / poboacion$sup1996
densidade.log <- log(densidade)

O proceso require da utilización de varios paquetes de R:

require(maptools)
require(rgdal)
require(RColorBrewer)
require(classInt)

A continuación cargamos en R o mapa vectorial, e creamos un campo 'codigoine' a partir dos códigos de provincia e municipio

mapa.municipios<-readOGR("./cartografia","DATOS_S_CONCELLOS_polygon")

mapa.municipios@data<-cbind(mapa.municipios@data, codigoine=mapa.municipios@data$CDPROVI*1000+mapa.municipios@data$CDMUNI)

Establecemos unha paleta de cores baseados no laranxa, a partir dos dispoñibles en ColorBrewer.

cores <- brewer.pal(9,"Oranges")

Creamos unha función que divida as observacións de poboación de cada ano en rangos fixos.

clases.f <- function(x) {
  classIntervals(x,
                 9,
                 style="fixed",
                 fixedBreaks=log(c(0.1,10,20,50,150,400,1000,3000,9000)))
}

Obtemos as coordenadas dos centroides dos concellos.

long<-coordinates(mapa.municipios)[,1]
lat<-coordinates(mapa.municipios)[,2]

Extraemos os anos a partir dos nomes das columnas na táboa 'poboacion'

anos <- substr(colnames(poboacion)[3:14],start=2,stop=5)

Creamos unha función 'mapa' que crea un ficheiro png de 800x600 píxeles co nome 'mapaxxxx.png' (onde xxxx é o ano).

mapa <- function(x) {
  
  png(filename=paste("mapa",x,".png",sep=""),
    width=800, height=600,
    units="px",
    bg="transparent") # Activa un dispositivo png onde pegar o gráfico resultante

  orde<-match(mapa.municipios@data$codigoine,
              poboacion$codigoine) # Establece a orde dos concellos na táboa de atributos do mapa vectorial
  
  par(mar=c(5,1,4,1)+.1) # Axustamos as marxes do gráfico
  clases <- clases.f(densidade.log[orde,x]) # Aplica a función 'clases.f' definida máis arriba sobre o logaritmo da densidade de poboación
  clases.cor <- findColours( clases, cores )
  tamaño <- sqrt(poboacion2[orde,x] / 1500 ) # Establecemos o tamaño dos puntos a partir do tamaño da poboación

  plot(mapa.municipios, col="white", lwd=.5, border="grey")
  title(main=anos[x],
        sub="(Elab. a partir de datos censais)",cex.main=2,cex.sub=1.5)
  points(long, lat,
         pch=19, 
         bg=clases.cor,
         col=clases.cor,
         cex=tamaño)
  
  legend(395000,4800000,
         legend=c("[0,10)","[10,20)","[20,50)","[50,150)","[150,400)","[400,1000)","[1000,3000)",">3000"),
         fill=attr(clases.cor,"palette"),
         bty="n",title="hab / km²",
         cex=1.5)
         
  points(410000,4680000,pch=19,bg="grey",cex=1)
  text(425000,4680000,"1500 hab",pos=4,cex=1.5)
  
  points(410000,4665000,pch=19,bg="grey",cex=5.16)
  text(425000,4665000,"40000 hab",pos=4,cex=1.5)
  
  points(410000,4640000,pch=19,bg="grey",cex=8.16)
  text(425000,4640000,"100000 hab",pos=4,cex=1.5)
  
  dev.off()
}

Xeramos os diferentes mapas empregando un bucle.

for(x in 1:12) {
  mapa(x)
}

Finalmente, o gráfico de animación foi xerado coa orde seguinte orde de imagemagick:

convert -delay 120 -loop 0 mapa*.png mapa.gif


3 comentarios:

  1. Ola!

    Caín aquí porque ando na procura dun mapa dos concellos de Galicia igual ó que supoño empregaches ti para este proxecto (por certo, ¡bo traballo! Pareceume bonito, e aprendín un par de trucos útiles). Preguntábame se poderías indicarme onde o atopaches, porque andiven buscando polas webs da Xunta e demás sen moito éxito.

    Graciñas! :)

    ResponderEliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. Ola! Gracias polo comentario.

    O mapa que empregamos neste exercicio foi descargado da web do Servizo de Información Ambiental (SIAM) da Xunta de Galicia hai uns anos. A distribución das webs cambiou desde entón, e o entramado de páxinas da CMATI, IET, SITGA, etc. é especialmente eficiente en impedir o acceso de información.

    Non obstante, no centro de descargas do Instituto Geográfico Nacional [1] (require rexistrarse como usuario) podes obter o mapa de concellos de toda España (líneas límite municipales), do que non che será difícil extraer os de Galicia.

    A modo de curiosidade, unha fonte útil para localizar límites administrativos de moitos países do mundo (a miúdo, pero non sempre, baseada nas fontes oficiais respectivas), é o proxecto "Global Administrative Areas" [2]. Os mapas que se descargan teñen normalmente diferentes niveis administrativos, desde o de Estado ata a división local.

    [1] http://centrodedescargas.cnig.es/CentroDescargas/inicio.do
    [2] http://www.gadm.org/

    ResponderEliminar