[R] Maps in R
Ott Toomet
otoomet at econ.dk
Wed Jan 8 08:09:03 CET 2003
| From: Nirmala Ravishankar <ravishan at fas.harvard.edu>
| Date: Tue, 7 Jan 2003 23:35:19 -0500 (EST)
|
| Is there a way to generate maps in R. Specifically, I have calculated
| estimates of intra-regional inequality for US states, and would like to
| project that information onto a map.
|
| Thanks,
| Nirmala
There is a package called maps at
ftp://ftp.mcs.vuw.ac.nz/pub/statistics/map/
(maps_0.1-4.tar.gz worked well for me at linux, I am not quite sure
about windows).
There are not many different countries present but US is, both on
state and county level. However, I have noticed problems with US maps
when experimenting with color codes.
There seem not to a function to plot each state with a given color,
the main function map() draws different polygons with different color
but a state may contain many polygons. I have written my own, I
include it below, it is made for Danish counties but should be easy to
change for e.g. US states.
BTW, I have made a low-resolution map for Danish counties, if anybody
has interest.
Best,
Ott
--------------------------------------------
This function plots Danish map with color codes as given by vector x.
x is a vector with names equal to county names. The function finds
itself maximum and minimum value of x, sets the colors accordingly,
and draws a legend.
mapPlot.default <- function(x, main=NULL, ...) {
### plot a vector on the map using names of the vector
mkPlot <- function(name, col) {
map("danmark", name, col=col, fill=T, add=T)
}
mkCol <- function(val) {
i <- as.integer(99*(val - x0)/(x1 - x0))
i <- ifelse(i < 1, 1, i)
i <- ifelse(i > 100, 100, i)
col[i]
}
if(!any(search() == "package:maps")) {
cat("Loading maps library...")
library(maps, lib.loc="/home/otoomet/proge/R")
cat("done\n")
}
x <- unlist(x)
opar <- par(xpd=TRUE,
las=0)
on.exit(par(opar), add=TRUE)
regionNames <- map("danmark", plot=FALSE, namesonly=TRUE)
r <- map("danmark", ...)$range
mtext(main, line=1, cex=1.5)
col <- topo.colors(100)
iRegions <- sapply(names(x), function(y) length(grep(y, regionNames)) > 0)
# which regions exist on the map
x <- x[iRegions]
x0 <- range(x)[1]
x1 <- range(x)[2]
sapply(seq(along=x),
FUN=function(i) mkPlot(names(x[i]), mkCol(x[i])))
lev <- zapsmall(pretty(x, n=10))
legx <- r[2]
legy <- r[4]
legend(legx, legy, legend=as.character(lev), fill=mkCol(lev),
bty="n")
}
More information about the R-help
mailing list