Dimitri Liakhovitski
2015-Apr-02 21:02 UTC
[R] Color US counties on US map using a numeric variable for color intensity
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
2015-Apr-02 21:08 UTC
[R] Color US counties on US map using a numeric variable for color intensity
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
Jim Lemon
2015-Apr-02 22:18 UTC
[R] Color US counties on US map using a numeric variable for color intensity
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. >[[alternative HTML version deleted]]