New to R. I am trying to create a simple xy plot wherein the line segment color is determined by a categorical column The following does not change colors for me, probably because I don't quite have a handle on either functions or value mapping syntax. ---------- time <- c(1, 2, 3, 7,10,11,14,16,20) pressure <- c(0,10,20,20,50,18,60,65,90) status <- c(0, 0, 1, 1, 1, 0, 3, 3, 3) measures <- c(time,pressure,status) attach(measures) statusColor <- function (x) { if (x==0) return ("green") if (x==1) return ("orange") if (x==2) return ("pink") if (x==3) return ("red") } par(mfrow=c(3,2)) plot(time,pressure,type="l") plot(time,pressure,type="l") plot(time,pressure,type="l") plot(time,pressure,type="l") plot(time,pressure,type="l",col=statusColor(status)) plot(time,pressure,type="l") ---------- Warning message: In if (x == 0) return("green") : the condition has length > 1 and only the first element will be used TIA, Richard A. DeVenezia
Hi I am not sure but you probably need to use segments. ?segments AFAIK for line there is only one colour for whole line possible. and in your function statusColor you shall not use if but ifelse or better statusColor <- function (x) { c("green","orange","pink","red")[x+1] } based on fact that x is vector of integers from 0 to 3. Regards Petr r-help-bounces at r-project.org napsal dne 23.09.2010 13:38:43:> New to R. I am trying to create a simple xy plot wherein the line > segment color is determined by a categorical column > > The following does not change colors for me, probably because I don't > quite have a handle on either functions or value mapping syntax. > ---------- > time <- c(1, 2, 3, 7,10,11,14,16,20) > pressure <- c(0,10,20,20,50,18,60,65,90) > status <- c(0, 0, 1, 1, 1, 0, 3, 3, 3) > measures <- c(time,pressure,status) > > attach(measures) > > statusColor <- function (x) { > if (x==0) return ("green") > if (x==1) return ("orange") > if (x==2) return ("pink") > if (x==3) return ("red") > } > > par(mfrow=c(3,2)) > plot(time,pressure,type="l") > plot(time,pressure,type="l") > plot(time,pressure,type="l") > plot(time,pressure,type="l") > plot(time,pressure,type="l",col=statusColor(status)) > plot(time,pressure,type="l") > ---------- > Warning message: > In if (x == 0) return("green") : > the condition has length > 1 and only the first element will be used > > > TIA, > Richard A. DeVenezia > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guidehttp://www.R-project.org/posting-guide.html> and provide commented, minimal, self-contained, reproducible code.
Something like this ? time <- c(1, 2, 3, 7,10,11,14,16,20) pressure <- c(0,10,20,20,50,18,60,65,90) status <- c(0, 0, 1, 1, 1, 0, 3, 3, 3) statusColor <- c("green", "orange", "pink", "red") plot(time, pressure) for (i in 2:length(time)) lines(time[(i-1):i], pressure[(i-1):i], col=statusColor[status[i]+1]) Michael On 23 September 2010 21:38, Richard DeVenezia <rdevenezia at gmail.com> wrote:> New to R. ?I am trying to create a simple xy plot wherein the line > segment color is determined by a categorical column > > The following does not change colors for me, probably because I don't > quite have a handle on either functions or value mapping syntax. > ---------- > time ? ? <- c(1, 2, 3, 7,10,11,14,16,20) > pressure <- c(0,10,20,20,50,18,60,65,90) > status ? <- c(0, 0, 1, 1, 1, 0, 3, 3, 3) > measures <- c(time,pressure,status) > > attach(measures) > > statusColor <- function (x) { > ?if (x==0) return ("green") > ?if (x==1) return ("orange") > ?if (x==2) return ("pink") > ?if (x==3) return ("red") > } > > par(mfrow=c(3,2)) > plot(time,pressure,type="l") > plot(time,pressure,type="l") > plot(time,pressure,type="l") > plot(time,pressure,type="l") > plot(time,pressure,type="l",col=statusColor(status)) > plot(time,pressure,type="l") > ---------- > Warning message: > In if (x == 0) return("green") : > ?the condition has length > 1 and only the first element will be used > > > TIA, > Richard A. DeVenezia > > ______________________________________________ > R-help at r-project.org mailing list > 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. >
Hi: time <- c(1, 2, 3, 7,10,11,14,16,20) pressure <- c(0,10,20,20,50,18,60,65,90) status <- c(0, 0, 1, 1, 1, 0, 3, 3, 3) # You want to combine the vectors into a data frame instead # of concatenating them into one long vector. df <- data.frame(time, pressure, status) df time pressure status 1 1 0 0 2 2 10 0 3 3 20 1 4 7 20 1 5 10 50 1 6 11 18 0 7 14 60 3 8 16 65 3 9 20 90 3 library(lattice) mycols <- c('green', 'orange', 'red') xyplot(pressure ~ time, data = df, group = status, type = 'b', col mycols) For this type of graphic, the lattice package works well. The package has its own book and extensive help pages. On Thu, Sep 23, 2010 at 4:38 AM, Richard DeVenezia <rdevenezia@gmail.com>wrote:> New to R. I am trying to create a simple xy plot wherein the line > segment color is determined by a categorical column > > The following does not change colors for me, probably because I don't > quite have a handle on either functions or value mapping syntax. > ---------- > time <- c(1, 2, 3, 7,10,11,14,16,20) > pressure <- c(0,10,20,20,50,18,60,65,90) > status <- c(0, 0, 1, 1, 1, 0, 3, 3, 3) > measures <- c(time,pressure,status) > > # A bad idea. Don't use attach(); use the function with(dataframe,expression) instead; see ?with> attach(measures) > > statusColor <- function (x) { > if (x==0) return ("green") > if (x==1) return ("orange") > if (x==2) return ("pink") > if (x==3) return ("red") > } > > par(mfrow=c(3,2)) > plot(time,pressure,type="l") > plot(time,pressure,type="l") > plot(time,pressure,type="l") > plot(time,pressure,type="l") > plot(time,pressure,type="l",col=statusColor(status)) > plot(time,pressure,type="l") > ---------- > Warning message: > In if (x == 0) return("green") : > the condition has length > 1 and only the first element will be used > > >HTH, Dennis> TIA, > Richard A. DeVenezia > > ______________________________________________ > R-help@r-project.org mailing list > 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]]
On 09/23/2010 09:38 PM, Richard DeVenezia wrote:> New to R. I am trying to create a simple xy plot wherein the line > segment color is determined by a categorical column > > The following does not change colors for me, probably because I don't > quite have a handle on either functions or value mapping syntax. > ---------- > time<- c(1, 2, 3, 7,10,11,14,16,20) > pressure<- c(0,10,20,20,50,18,60,65,90) > status<- c(0, 0, 1, 1, 1, 0, 3, 3, 3) > measures<- c(time,pressure,status) > > attach(measures) > > statusColor<- function (x) { > if (x==0) return ("green") > if (x==1) return ("orange") > if (x==2) return ("pink") > if (x==3) return ("red") > } > > par(mfrow=c(3,2)) > plot(time,pressure,type="l") > plot(time,pressure,type="l") > plot(time,pressure,type="l") > plot(time,pressure,type="l") > plot(time,pressure,type="l",col=statusColor(status)) > plot(time,pressure,type="l") > ---------- > Warning message: > In if (x == 0) return("green") : > the condition has length> 1 and only the first element will be used >Hi Richard, Look at the color.scale.lines function in the plotrix package. Jim