views:

145

answers:

1

EDIT: I have realized the source of my problem. I only have count information for the counties which I have data for, which is less than the number of counties in the area I'm plotting against.

It stands to reason that the problem lines of code are here:

mapnames <- map("county",plot=FALSE)[4]$names
colorsmatched <- d$colorBuckets [na.omit(match(mapnames ,d$stcon))]

Does anyone have advice on how to generate a vector of the appropriate length that would match the # of counties in NY, NJ, CT, and PA from the maps library? I want to merge the count data I have and include zeros for the counties I don't have information on.

I am trying to follow the tutorial described here: http://www.thisisthegreenroom.com/2009/choropleths-in-r/

The below code executes, but it is either not matching my dataset with the maps_counties data properly, or it isn't plotting it in the order I would expect. For example, the resulting areas for the greater NYC area show no density while random counties in PA show the highest density.

The general format of my data table is:

county state count
fairfield connecticut 17
hartford connecticut 6
litchfield connecticut 3
new haven connecticut 12
...
...
westchester new york 70
yates new york 1
luzerne pennsylvania 1

Note this data is in order by state and then county and includes data for CT, NJ, NY, & PA.

First, I read in my data set:

library(maps)
library(RColorBrewer)
d <- read.table("gissum.txt", sep="\t", header=TRUE)

#Concatenate state and county info to match maps library
d$stcon <- paste(d$state, d$county, sep=",")

#Color bins
colors = brewer.pal(5, "PuBu")
d$colorBuckets <- as.factor(as.numeric(cut(d$count,c(0,10,20,30,40,50,300))))

Here is my matching

mapnames <- map("county",plot=FALSE)[4]$names
colorsmatched <- d$colorBuckets [na.omit(match(mapnames ,d$stcon))]

Plotting:

map("county"
  ,c("new york","new jersey", "connecticut", "pennsylvania")
  ,col = colors[d$colorBuckets[na.omit(match(mapnames ,d$stcon))]]
  ,fill = TRUE
  ,resolution = 0
  ,lty = 0
  ,lwd= 0.5
)
map("state"
  ,c("new york","new jersey", "connecticut", "pennsylvania")
  ,col = "black"
  ,fill=FALSE
  ,add=TRUE
  ,lty=1
  ,lwd=2
)

map("county"
   ,c("new york","new jersey", "connecticut", "pennsylvania")
   ,col = "black"
   ,fill=FALSE
   ,add=TRUE
  , lty=1
  , lwd=.5
)
title(main="Respondent Home ZIP Codes by County")

I am sure I am missing something basic re: the order in which the maps function plots items - but I can't seem to figure it out. Thanks for the help. Please let me know if you need any more information.

A: 

Here is a possible solution to your problem by merging your data with data from maps of select states. Is this what you were looking for?

library(maps);
library(RColorBrewer);

# Create Dummy Data Frame to Play With

d = rbind(c('fairfield','connecticut',17),c('westchester','new york',70), c('luzerne','pennsylvania',1));
d = data.frame(d);
names(d) = c("county", "state", "count");
d$count = as.numeric(as.character(d$count));
d$stcon = paste(d$state, d$county, sep=",");

# Extract mapnames for States

mapnames2 = map("county",c("new york","new jersey", "connecticut", "pennsylvania"),plot=FALSE)[4]$names;
mapnames2 = data.frame(mapnames2);
names(mapnames2) = "stcon";

# Merge with d

d = merge(mapnames2, d, all = T);
d$count[is.na(d$count)] = 0;


# Color bins
colors = brewer.pal(5, "PuBu");
d$colorBuckets = as.factor(as.numeric(cut(d$count,c(0,10,20,30,40,50,300))));

map("county"
  ,c("new york","new jersey", "connecticut", "pennsylvania")
  ,col = colors[d$colorBuckets]
  ,fill = TRUE
  ,resolution = 0
  ,lty = 0
  ,lwd= 0.5
)
map("state"
  ,c("new york","new jersey", "connecticut", "pennsylvania")
  ,col = "black"
  ,fill=FALSE
  ,add=TRUE
  ,lty=1
  ,lwd=2
)

map("county"
   ,c("new york","new jersey", "connecticut", "pennsylvania")
   ,col = "black"
   ,fill=FALSE
   ,add=TRUE
  , lty=1
  , lwd=.5
)
title(main="Respondent Home ZIP Codes by County")
Ramnath
This was exactly what I needed. Thanks for the thoughtful response!
Chase

related questions