Hi, Matplot works with x being Date class but not POSIXt. Here is the example with R version 2.5.0 Under development (unstable) (2006-12-06 r40129) Example: x <- Sys.Date() - c(1:10) y <- cbind(1:10, 10:1) class(x) ## [1] "Date" matplot(x, y) x <- strptime(as.character(x), format="%Y-%m-%d") ## [1] "POSIXt" "POSIXlt" matplot(x, y) Error in matplot(x, y) : 'x' and 'y' must have only 1 or the same number of columns Additionally, matplot with x being Date class does not use apropriate annotation for x axis. Thank you! Gregor
Matplot does not work with x being POSIXt class (PR#9412)
4 messages · Gregor Gorjanc, Peter Dalgaard, Don MacQueen
gregor.gorjanc at bfro.uni-lj.si wrote:
Hi, Matplot works with x being Date class but not POSIXt. Here is the example with R version 2.5.0 Under development (unstable) (2006-12-06 r40129) Example: x <- Sys.Date() - c(1:10) y <- cbind(1:10, 10:1) class(x) ## [1] "Date" matplot(x, y) x <- strptime(as.character(x), format="%Y-%m-%d") ## [1] "POSIXt" "POSIXlt" matplot(x, y) Error in matplot(x, y) : 'x' and 'y' must have only 1 or the same number of columns Additionally, matplot with x being Date class does not use apropriate annotation for x axis.
Matplot plots matrices, it is not a bug that it doesn't work with other objects. Rather, it is a coincidence that it works with dates when their internal representation is as numbers. It might be a useful enhancement, but things are not so easy: The root of the issue is that matrices of time/date objects don't behave nicely. Try, e.g. structure(matrix(1:10, 2), class = "Date") matrix(structure(1:10, class = "Date"), 2) The former will actually work in the sense that it allows indexing, it just forgets about dimensions when printing. The latter throws away the class of x, and is used inside matplot() hence the annotation will not be that for a Date object. Also, as.matrix.POSIXlt() does something completely different, so things get a bit tricky...
As Peter said, matplot plots matrices. The columns of a matrix are vectors of numbers. A POSIXlt object is not a vector of numbers, it is a list. So it shouldn't work. And should not be expected to work. But with a POSIXct object it will work. x <- strptime(as.character(x), format="%Y-%m-%d") ## [1] "POSIXt" "POSIXlt" matplot( as.POSIXct(x), y)
At 1:56 PM +0100 12/7/06, gregor.gorjanc at bfro.uni-lj.si wrote:
Hi, Matplot works with x being Date class but not POSIXt. Here is the example with R version 2.5.0 Under development (unstable) (2006-12-06 r40129) Example: x <- Sys.Date() - c(1:10) y <- cbind(1:10, 10:1) class(x) ## [1] "Date" matplot(x, y) x <- strptime(as.character(x), format="%Y-%m-%d") ## [1] "POSIXt" "POSIXlt" matplot(x, y) Error in matplot(x, y) : 'x' and 'y' must have only 1 or the same number of columns Additionally, matplot with x being Date class does not use apropriate annotation for x axis.
This is very easy to obtain: # x is a Date object matplot(x,y,xaxt='n') axis.Date(1,x) or # x is a POSIXlt object matplot( as.POSIXct(x), y,xaxt='n') axis.POSIXct(1,x) So easy, in fact, that I personally would not expect R core to spend time on it. One of the virtues of R is that the language is so rich that little tweaks like this are often very easy.
Thank you! Gregor
-Don
-------------------------------------- Don MacQueen Environmental Protection Department Lawrence Livermore National Laboratory Livermore, CA, USA
Hi,
Don MacQueen wrote:
...
At 1:56 PM +0100 12/7/06, gregor.gorjanc at bfro.uni-lj.si wrote:
Hi, Matplot works with x being Date class but not POSIXt. Here is the example with R version 2.5.0 Under development (unstable) (2006-12-06 r40129) Example: x <- Sys.Date() - c(1:10) y <- cbind(1:10, 10:1) class(x) ## [1] "Date" matplot(x, y) x <- strptime(as.character(x), format="%Y-%m-%d") ## [1] "POSIXt" "POSIXlt" matplot(x, y) Error in matplot(x, y) : 'x' and 'y' must have only 1 or the same number of columns Additionally, matplot with x being Date class does not use apropriate annotation for x axis.
This is very easy to obtain: # x is a Date object matplot(x,y,xaxt='n') axis.Date(1,x) or # x is a POSIXlt object matplot( as.POSIXct(x), y,xaxt='n') axis.POSIXct(1,x) So easy, in fact, that I personally would not expect R core to spend time on it. One of the virtues of R is that the language is so rich that little tweaks like this are often very easy.
Thank you Peter and Don for these insights. I see that changes would be far from trivial/tricky and as Don pointed out simple tweaks by the user can solve this. Thank you and sorry for inconvenience! Best wishes, Gregor