Определенно широкий вопрос, и работа с пространственным представлением задач (как предложил Роман) является отличной отправной точкой. Я предпочитаю работать с ggplot, когда дело доходит до отображения, хотя это и требует некоторого усилия. Некоторые из следующих действий не будут иметь смысла, пока вы не наткнетесь на некоторые темы пространственных задач, но, по сути, они берут шейп-файл из Statistics Canada, упрощает его (поэтому многоугольники не загружаются/вычерчиваются вечно), а затем раскрашивает их по площади:
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
![введите здесь описание изображения](https://i.stack.imgur.com/UDYEZ.png)
Работать с чем-то вроде данных о населении очень похоже. Я нашел некоторые данные о населении провинций, и ниже приведена схема для них (которая может быть чрезмерно упрощена, но я стремился упростить построение переписных районов) на основе населения.
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
![введите здесь описание изображения](https://i.stack.imgur.com/IvMDY.png)
Вы определенно захотите взглянуть на значения столбцов в 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
![введите здесь описание изображения](https://i.stack.imgur.com/vBqzA.png)
person
hrbrmstr
schedule
27.09.2014
sp
пакеты связывают их все. - person Roman Luštrik   schedule 27.09.2014