Re: [R] Help with plotting a line that is multicoloured based on levels of a factor

From: David Winsemius <dwinsemius_at_comcast.net>
Date: Fri, 25 Mar 2011 19:57:41 -0400

On Mar 25, 2011, at 4:19 PM, Pam Allen wrote:

> Hello again,
>
> I wrote an example that better represents my data, since the
> coloured points
> are actually consecutive, but with variable lengths:
>
> date=as.Date(c(1:300))
> flow=sin(2*pi/53*c(1:300))
> levels=c(rep(c("high","med","low"),100))
> data=cbind.data.frame(date, flow, levels)

Oh my lord, that looks way, way too complicated! Why not do it with your previous dataset and replace your `levels` misdirection with a correct method for the goal that I never saw articulated in standard English. The findInterval function can be used as an index to a color vector to he a color-encoded height:

date=c(1:300)
flow=sin(2*pi/53*c(1:300))
dat=cbind.data.frame(date, flow) ### Three lines

with(dat,plot(date,flow,type="n"))
with(dat, segments(date[1:299],flow[1:299], # starting points for segments

                     date[2:300],flow[2:300],  # ending points offset  
by 1
             col=c("purple","green","blue", "red")[
                            findInterval(flow[1:299],  
c(-1,0,.75,.85,1))]))

See attached: (Don't need no steenking `levels`.)

>
> library(zoo)
> z <- zoo(data$flow, data$date)
> zz
> =
> cbind.data.frame(date=as.Date(rownames(cbind.data.frame(rollapply(z,
> 2,
> align = "right", FUN="+")))),flow.change=(rollapply(z, 2, align =
> "right",FUN="+" )))
> names(zz)=c("date","todays.flow","next.day.flow")
> zzz=cbind.data.frame(zz[,1], (zz[,3]-zz[,2]))
> names(zzz)=c("date","change.flow")
> data2=merge(data, zzz)
> rate=zoo(data2$change.flow,data2$date)
> x
> =
> cbind
> .data.frame(date=as.Date(rownames(cbind.data.frame(rollapply(rate, 2,
> align="left", FUN="+")))), sign=rollapply(rate, 2,
> align="left",FUN="+"))
> names(x)=c("date","todays.change","next.day.change")
> xx=cbind.data.frame(x[,1],(x[,3]*x[,2]))
> names(xx)=c("date","sign")
> data2=merge(data2, xx)
>
> data3=cbind(data2,pass1=
> ifelse(data2$flow<0, "extreme.low",
> ifelse(data2$flow>=0.9, "extreme.high","NA")))
> data4=cbind(data3, pass2=
>
> ifelse
> (data3
> $
> flow
> <
> 0.8
> &data3
> $
> flow>0&data3$change.flow>=0&data3$change>=0&data3$pass1=="NA","medium"
> ,
>
> ifelse
> (data3
> $
> flow
> <
> 0.7
> &data3
> $
> flow
> >
> 0
> &data3$change.flow<0&data3$change<0&data3$pass1=="NA","medium","NA")))
> data4$pass1=paste(data4$pass1, data4$pass2)
> data4$pass1=replace(data4$pass1, data4$pass1=="NA NA", "low")
>
> dat=cbind(data4[,1:5], class=
> ifelse(data4$pass1=="extreme.high NA","1.Extreme.High",
> ifelse(data4$pass1=="NA medium","2.Medium",
> ifelse(data4$pass1=="low","3.Low",
> ifelse(data4$pass1=="extreme.low NA","4.Extreme.Low",NA)))))
>
> colour=ifelse(dat$class=="1.Extreme.High","red",
> ifelse(dat$class=="2.Medium","green",
> ifelse(dat$class=="3.Low","blue",
> ifelse(dat$class=="4.Extreme.Low","purple",""))))
> plot(dat$date, dat$flow, col=colour)
>
>
> What I would like to do is to plot this using a line with the correct
> colours instead of points, i.e.:
>
> plot(dat$date, dat$flow, col=colour, type="l") ##Doesn't work,
> because the
> line is continuous
>
> Any help would be much appreciated. Thank you!

>
> -Pam
>
> --
> View this message in context: http://r.789695.n4.nabble.com/Help-with-plotting-a-line-that-is-multicoloured-based-on-levels-of-a-factor-tp3385857p3406309.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> 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.

David Winsemius, MD
West Hartford, CT



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.
Received on Sat 26 Mar 2011 - 00:01:42 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Mon 28 Mar 2011 - 19:40:25 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive