加拿大人口普查地图划分在R

时间:2014-09-27 19:11:12

标签: r maps census

我对R和绘图很新,我想创建一些特定数据的地图。我有一组名为" D.Montreal"这显示了2010年加拿大人口普查区的访客来自蒙特利尔。我想用这些数据创建一张地图,以显示有多少人来自不同地区,可能会根据人数对不同颜色的地图进行着色。 / p>

我是否可以使用包裹来加拿大人口普查划分?

到目前为止,我已经提出了加拿大的概要:

map("worldHires","Canada", xlim=c(-141,-53), ylim=c(40,85), col="grey90", fill=TRUE)

非常感谢你!

1 个答案:

答案 0 :(得分:11)

绝对是一个广泛的问题,并且通过空间任务视图(正如罗马建议的那样)是一个很好的起点。在绘图方面,我更喜欢使用ggplot,虽然它需要一些肘部油脂。在你遇到一些空间任务主题之前,下面的一些内容是没有意义的,但它基本上从Statistics Canada抓取一个shapefile,简化了它(所以多边形不需要永远加载/绘图)和然后按地区着色:

library(rgeos)
library(rgdal)
library(maptools)
library(sp)
library(ggplot2)

# decent, uncluttered map theme (needs devtools package tho)
devtools::source_gist("https://gist.github.com/hrbrmstr/33baa3a79c5cfef0f6df")

# grab the file from "Statistics Canada"
download.file("http://www12.statcan.gc.ca/census-recensement/2011/geo/bound-limit/files-fichiers/gcd_000b11a_e.zip",
              destfile="gcd_000b11a_e.zip")

unzip("gcd_000b11a_e.zip")

# this simplifies the polygons so they load/plot faster
system("ogr2ogr canada.shp gcd_000b11a_e.shp -simplify 0.01")

# what layers do we have? you can use this to check
#   ogrListLayers("gcd_000b11a_e/canada.shp")
# but there are none, so the shapefile is the layer

canada <- readOGR("gcd_000b11a_e/","canada")

# do this to see what's available from an "identifier" standpoint
# "CDNAME" seems to be the census district name
# "PRNAME" seems to be the province name
# str(canada@data)

# rig up  some data
# make a data frame of census division areas
# you can assign as many value columns as you like
# they get merged in later and can be used as the fill level
# we'll use the area as the fill level
map_areas <- data.frame(id=canada@data$CDNAME,
                        area=sapply(slot(canada, "polygons"), slot, "area") )

# this takes a while, but it makes a data frame for use with
# ggplot and lets us use the census division name for doing things
# like applying colors
canada_map <- fortify(canada, region="CDNAME")

# merge in areas
canada_map <- merge(canada_map, map_areas, by="id")

gg <- ggplot()
gg <- gg + geom_map(data=canada_map, map=canada_map,
                    aes(map_id=id, x=long, y=lat, group=group, fill=log1p(area)),
                    color="white", size=0.1)
gg <- gg + coord_map() # can choose other projections
gg <- gg + theme_map()
gg

enter image description here

使用像人口数据这样的东西是非常相似的。我找到了一些关于省人口的数据,以下是基于人口的那些(可能过于简化,但我的目标是使人口普查区更容易绘制)的等值。

province_pop <- data.frame(
  id=c("Newfoundland and Labrador / Terre-Neuve-et-Labrador",
       "Prince Edward Island / Île-du-Prince-Édouard",
       "Nova Scotia / Nouvelle-Écosse", "New Brunswick / Nouveau-Brunswick",
       "Quebec / Québec", "Ontario", "Manitoba", "Saskatchewan",
       "Alberta", "British Columbia / Colombie-Britannique", "Yukon",
       "Northwest Territories / Territoires du Nord-Ouest", "Nunavut"),
  population=c(526977.0, 146283.0, 942668.0, 753914.0, 8214672.0, 13678740.0, 
               1282043.0, 1125410.0, 4121692.0, 4631302.0, 36510.0, 43623.0, 36585.0))

canada_map <- fortify(canada, region="PRNAME")
canada_map <- merge(canada_map, province_pop, by="id")

gg <- ggplot()
gg <- gg + geom_map(data=canada_map, map=canada_map,
                    aes(map_id=id, x=long, y=lat, group=group, fill=population),
                    color="white", size=0.5)
gg <- gg + scale_fill_continuous(low="#ccebc5", high="#084081")
gg <- gg + coord_map()
gg <- gg + theme_map()
gg

enter image description here

您肯定希望查看canada@data中列的值,因为您可以看到省名,它们可能包含法语和英语版本。

我可以伪造一些人口普查区人口数据,以显示它的方法相同:

fake_census_pop <- data.frame(
  id=unique(as.character(canada@data$CDNAME)),
  fake_pop=sample(500000:30000000, length(unique(as.character(canada@data$CDNAME)))))

canada_map <- fortify(canada, region="CDNAME")
canada_map <- merge(canada_map, fake_census_pop, by="id")

gg <- ggplot()
gg <- gg + geom_map(data=canada_map, map=canada_map,
                    aes(map_id=id, x=long, y=lat, group=group, fill=fake_pop),
                    color="white", size=0.1)
gg <- gg + scale_fill_continuous(low="#ccebc5", high="#084081")
gg <- gg + coord_map()
gg <- gg + theme_map()
gg

enter image description here