[R] Color US counties on US map using a numeric variable for color intensity

Dimitri Liakhovitski dimitri.liakhovitski at gmail.com
Fri Apr 3 01:05:15 CEST 2015


This is really cool, Jim - thanks a lot!

On Thu, Apr 2, 2015 at 6:18 PM, Jim Lemon <drjimlemon at gmail.com> wrote:
> Hi Dimitri,
> You can also try the color.scale function in plotrix, which allows you to
> specify the NA color in the call.
>
> newcol<-color.scale(mydata.final$Mean.Wait,extremes=c("yellow","red"),na.color="white")
>
> Jim
>
>
> On Fri, Apr 3, 2015 at 8:08 AM, Dimitri Liakhovitski
> <dimitri.liakhovitski at gmail.com> wrote:
>>
>> Jean, I think I fixed it:
>>
>> newpal <- colorRamp(c("yellow", "red"))
>> missing <- is.na(mydata.final$Mean.Wait)
>> newcol <- ifelse(missing, "white",
>>
>> rgb(newpal(mydata.final$Mean.Wait[!is.na(mydata.final$Mean.Wait)]/
>>                                   max(mydata.final$Mean.Wait,
>> na.rm=T)), maxColorValue=255))
>> map('county', fill=TRUE, col=newcol,
>>     resolution=0, lty=0, bg="transparent")
>> map('state', lwd=1, add=TRUE)
>>
>> One understanding question: what exactly does this rgb line do and why
>> do we have to say "maxColorValue=255"?
>> Thank you!
>>
>> On Thu, Apr 2, 2015 at 5:02 PM, Dimitri Liakhovitski
>> <dimitri.liakhovitski at gmail.com> wrote:
>> > Thank you, Jean, but I think this newcol line is not working. I am
>> > running:
>> >
>> > newcol <- ifelse(missing, "white",
>> >
>> > rgb(newpal(mydata.final$Mean.Wait/max(mydata.final$Mean.Wait,
>> > na.rm=T)),
>> >                      maxColorValue=255))
>> >
>> > # And I am getting:
>> > Error in rgb(newpal(mydata.final$Mean.Wait/max(mydata.final$Mean.Wait,
>> > :
>> >   color intensity NA, not in 0:255
>> >
>> > I think it's not liking the NAs - despite the ifelse...
>> >
>> > On Thu, Apr 2, 2015 at 4:26 PM, Adams, Jean <jvadams at usgs.gov> wrote:
>> >> Dimitri,
>> >>
>> >> You could use colorRamp() and rgb() to get more continuous colors.
>> >> For example
>> >>
>> >> newpal <- colorRamp(c("yellow", "red"))
>> >> missing <- is.na(mydata.final$Mean.Wait)
>> >> newcol <- ifelse(missing, "white",
>> >>   rgb(newpal(mydat$Mean.Wait/max(mydat$Mean.Wait)), maxColorValue=255))
>> >> map('county', fill=TRUE, col=newcol,
>> >>             resolution=0, lty=0, bg="transparent")
>> >> map('state', lwd=1, add=TRUE)
>> >>
>> >> Jean
>> >>
>> >>
>> >> On Thu, Apr 2, 2015 at 12:03 PM, Dimitri Liakhovitski
>> >> <dimitri.liakhovitski at gmail.com> wrote:
>> >>>
>> >>> I have a data frame 'mydata.final' (see below) that contains US
>> >>> counties and a continuous numeric variable 'Mean.Wait' that ranges
>> >>> from zero to 10 or so. I also created variable 'wait' that is based on
>> >>> the 'Mean.Wait' and takes on discrete values from 1 (lowest values on
>> >>> 'Mean.Wait') to 5 (highest values on 'Mean.Wait').
>> >>>
>> >>> I can create a map of the US with the counties colored based on the
>> >>> values of 'wait' using R package 'maps':
>> >>>
>> >>> #################################################################
>> >>> ### Generating an artificial data file:
>> >>> #################################################################
>> >>> library(maps)
>> >>> mydata.final <- data.frame(county = (map('county', plot =
>> >>> FALSE)$names),
>> >>>                  stringsAsFactors = F)
>> >>>
>> >>> ### My numeric variable:
>> >>> set.seed(123)
>> >>> mydata.final$Mean.Wait <- runif(nrow(mydata.final)) * 10
>> >>>
>> >>> ### Introducing NAs to mimic my real data set:
>> >>> set.seed(1234)
>> >>> mydata.final$Mean.Wait[sample(1:nrow(mydata.final), 1500)] <- NA
>> >>>
>> >>> ### Cutting the original numeric variable into categories
>> >>> ### because I don't know how to color based on 'Mean.Wait':
>> >>> mydata.final$wait <- cut(mydata.final$Mean.Wait, breaks = 5)
>> >>> levels(mydata.final$wait) <- 1:5
>> >>> mydata.final$wait <- as.numeric(as.character(mydata.final$wait))
>> >>>
>> >>> ####################################################################
>> >>> Building a US map based on 'wait' (5 categories)
>> >>> #################################################################
>> >>>
>> >>> ### Creating my 5 colors:
>> >>> pal <- colorRampPalette(c("yellow", "red"))
>> >>> allcolors <- pal(5)
>> >>>
>> >>> ### Looking at my 5 colors:
>> >>> barplot(1:5, rep(1,5), col = allcolors, horiz = T)
>> >>>
>> >>> ### Builiding the US map using 5 categories in 'wait':
>> >>> map('county', fill = TRUE, col = allcolors[mydata.final$wait],
>> >>>             resolution = 0, lty = 0, bg = "transparent")
>> >>> map('state', lwd=1, add=TRUE)
>> >>>
>> >>> My goal is: instead of splitting 'Mean.Wait' into 5 ordered categories
>> >>> ('wait'), I'd like to color the counties on the map based on the
>> >>> intensity of my (continuous) 'Mean.Wait'. What would be the way to do
>> >>> it and maybe even to add a legend?
>> >>> Thanks a lot!
>> >>>
>> >>> --
>> >>> Dimitri Liakhovitski
>> >>>
>> >>> ______________________________________________
>> >>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> >>> https://stat.ethz.ch/mailman/listinfo/r-help
>> >>> PLEASE do read the posting guide
>> >>> http://www.R-project.org/posting-guide.html
>> >>> and provide commented, minimal, self-contained, reproducible code.
>> >>
>> >>
>> >
>> >
>> >
>> > --
>> > Dimitri Liakhovitski
>>
>>
>>
>> --
>> Dimitri Liakhovitski
>>
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>
>



-- 
Dimitri Liakhovitski



More information about the R-help mailing list