[R] Need help with panel.segment..

From: Ghosh, Sandeep <sghosh_at_lexgen.com>
Date: Tue 26 Apr 2005 - 02:13:29 EST


Hi All,

For the following code, I'm not sure why the error bars are appearing horizontal. Can someone please tell me how to fix the problem.

testdata <- as.data.frame(t(structure(c(1,2004,"LV1",3.8,2,87,2,2004,"LV1",3.2,3,28,3,2004,"LV1",3.4,3,88,4,2004,"LV1",3,2,26,5,2004,"LV1",3.8,2,87,6,2004,"LV1",3.2,3,28,7,2004,"LV1",3.4,3,88,8,2004,"LV1",3,2,26,9,2004,"LV1",3.8,2,87,10,2004,"LV1",3.2,3,28,11,2004,"LV1",3.4,3,88,12,2004,"LV1",3,2,26,1,2005,"LV1",3.8,2,87,2,2005,"LV1",3.2,3,28,3,2005,"LV1",3.4,3,88,4,2005,"LV1",3,2,26), .Dim=c(6,16)))); colnames(testdata) <- c('month', 'year', 'dataset','mean','stdDev','miceCount'); testdata[c("month", "mean")] <- lapply(testdata[c("month", "mean")], function(x) as.numeric(levels(x)[x])); testdata <- testdata[do.call("order", testdata), ]; trellis.par.set(theme = col.whitebg());
with(testdata,

     barchart(mean ~ month | year,
	      horizontal=FALSE,
	      layout=c(1,2),
              origin = 0,
              sd = as.numeric(as.character(stdDev)),
              count = as.numeric(as.character(miceCount)),
              panel = function(x, y, ..., sd, count, subscripts) {
                  panel.barchart(x, y, ...)
                  sd <- sd[subscripts]
                  count <- count[subscripts]
                  panel.segments(x - sd / sqrt(count),
                                 as.numeric(y),
                                 x + sd / sqrt(count),
                                 as.numeric(y),
                                 col = 'red', lwd = 2)
              }))


Thanks,
Sandeep

-----Original Message-----
From: Deepayan Sarkar [mailto:deepayan@stat.wisc.edu] Sent: Thursday, April 21, 2005 9:13 PM
To: r-help@stat.math.ethz.ch
Cc: Ghosh, Sandeep
Subject: Re: [R] Need help with R date handling and barchart with errorbars

On Thursday 21 April 2005 17:44, Ghosh, Sandeep wrote:
> Hi All..
>
> Have a question.. For the following r code
>
> testdata <- as.data.frame(t(structure(c(
> "1/1/04","LV1",3.8,2,87,
> "2/1/04","LV1",3.2,3,28,
> "3/1/04","LV1",3.4,3,88,
> "4/1/04","LV1",3,2,26,
> "5/1/04","LV1",3.8,2,87,
> "6/1/04","LV1",3.2,3,28,
> "7/1/04","LV1",3.4,3,88,
> "8/1/04","LV1",3,2,26,
> "9/1/04","LV1",3.8,2,87,
> "10/1/04","LV1",3.2,3,28,
> "11/1/04","LV1",3.4,3,88,
> "12/1/04","LV1",3,2,26,
> "1/1/05","LV1",3.8,2,87,
> "2/1/05","LV1",3.2,3,28,
> "3/1/05","LV1",3.4,3,88,
> "4/1/05","LV1",3,2,26
> ), .Dim=c(5,16))));

Which makes all the columns factors. Odd choice.

> colnames(testdata) <-
> c('date','dataset','mean','stdDev','miceCount');
> testdata[c("date")] <- lapply(testdata[c("date")],
> function(x) as.date(levels(x)[x]));
> testdata[c("mean")] <- lapply(testdata[c("mean")], function(x)
> as.numeric(levels(x)[x]));
>
> On trying to print the data frame
>
> >testdata
>
> I get this..
>
> date dataset mean stdErr miceCount
> 1 -20454 LV1 3.8 2 87
> 2 -20423 LV1 3.2 3 28
> 3 -20394 LV1 3.4 3 88
> 4 -20363 LV1 3.0 2 26
> 5 -20333 LV1 3.8 2 87
> 6 -20302 LV1 3.2 3 28
> 7 -20272 LV1 3.4 3 88
> 8 -20241 LV1 3.0 2 26
> 9 -20210 LV1 3.8 2 87
> 10 -20180 LV1 3.2 3 28
> 11 -20149 LV1 3.4 3 88
> 12 -20119 LV1 3.0 2 26
> 13 -20088 LV1 3.8 2 87
> 14 -20057 LV1 3.2 3 28
> 15 -20029 LV1 3.4 3 88
> 16 -19998 LV1 3.0 2 26
>
> where as when I run this
>
> >dates <- c(lapply(testdata[c("date")], function(x)
> > as.date(levels(x)[x])));
>
> the ouput is
> $date
> [1] 1Jan4 1Feb4 1Mar4 1Apr4 1May4 1Jun4 1Jul4 1Aug4 1Sep4 1Oct4
> 1Nov4 1Dec4 [13] 1Jan5 1Feb5 1Mar5 1Apr5
>
> Question:
> 1. Can someone please explain me why the difference.

No difference (except that the print method for data.frame's doesn't know about 'date's.). Note that you have managed to create dates approximately 2000 years in the past.

> 2. I later want to plot the data using barchart eg (barchart(date ~
> mean | dataset, data=testdata);) in which case will the dates appear
> in assending order of dates or something special needs to be done for
> that.

If all you want is the dates in the right order, you could do:

testdata$date <- factor(testdata$date, levels = testdata$date)

> 3. Also I'll really appreciate if anyone can tell me if there's a way
> to get stdErrorBars on charts that are drawn using barchart function
> in lattice package.

The S language encourages the user to program the little things that are not readily available. In this case (making a guess about what sort of error bar you want):

with(testdata,

     barchart(date ~ as.numeric(as.character(mean)) | dataset,
              origin = 0,
              sd = as.numeric(as.character(stdDev)),
              count = as.numeric(as.character(miceCount)),
              panel = function(x, y, ..., sd, count, subscripts) {
                  panel.barchart(x, y, ...)
                  sd <- sd[subscripts]
                  count <- count[subscripts]
                  panel.segments(x - sd / sqrt(count),
                                 as.numeric(y),
                                 x + sd / sqrt(count),
                                 as.numeric(y),
                                 col = 'red', lwd = 2)
              }))


which would have been more readable if everything in your data frame were not factors. (It's none of my business, but I think dotplots would be a better choice than barcharts if you want to add error bars.)

Deepayan



R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html Received on Tue Apr 26 02:18:48 2005

This archive was generated by hypermail 2.1.8 : Fri 03 Mar 2006 - 03:31:25 EST