7
> x <- data.frame(a = rnorm(10), b = rnorm(10), c = rnorm(10))
> x
             a          b            c
1  -1.09651022 -0.7416278  0.209405373
2   1.53644398 -0.9463432  0.374955227
3   1.71132675 -0.3828052  2.024143398
4  -1.10622882 -0.3599187 -0.808780103
5  -0.49616562  0.7061180  0.644142118
6  -1.75452442  0.3890812 -0.623815889
7   0.06315648  0.5103820 -1.501873998
8   0.64856129 -1.0973679  1.432024595
9  -0.62828873 -0.3159317  0.183674189
10 -0.82657934  1.6376569 -0.003601196
> rownames(x) <- as.Date(Sys.Date() - 9:0)
> x
                     a          b            c
2013-06-07 -1.09651022 -0.7416278  0.209405373
2013-06-08  1.53644398 -0.9463432  0.374955227
2013-06-09  1.71132675 -0.3828052  2.024143398
2013-06-10 -1.10622882 -0.3599187 -0.808780103
2013-06-11 -0.49616562  0.7061180  0.644142118
2013-06-12 -1.75452442  0.3890812 -0.623815889
2013-06-13  0.06315648  0.5103820 -1.501873998
2013-06-14  0.64856129 -1.0973679  1.432024595
2013-06-15 -0.62828873 -0.3159317  0.183674189
2013-06-16 -0.82657934  1.6376569 -0.003601196
> class(x)
[1] "data.frame"
> boxplot(x)

enter image description here

> xx <- as.xts(x, order.by = as.Date(rownames(x)))
> xx
                     a          b            c
2013-06-07 -1.09651022 -0.7416278  0.209405373
2013-06-08  1.53644398 -0.9463432  0.374955227
2013-06-09  1.71132675 -0.3828052  2.024143398
2013-06-10 -1.10622882 -0.3599187 -0.808780103
2013-06-11 -0.49616562  0.7061180  0.644142118
2013-06-12 -1.75452442  0.3890812 -0.623815889
2013-06-13  0.06315648  0.5103820 -1.501873998
2013-06-14  0.64856129 -1.0973679  1.432024595
2013-06-15 -0.62828873 -0.3159317  0.183674189
2013-06-16 -0.82657934  1.6376569 -0.003601196
> class(xx)
[1] "xts" "zoo"
> boxplot(xx)
Error in try.xts(c(2.12199579096527e-314, 2.12199579096527e-314, 0, 2.12199579096527e-314,  : 
  Error in xts(coredata(x), order.by = index(x), .CLASS = "xts", ...) :   order.by requires an appropriate time-based object
> 

of course...

> boxplot(as.matrix(xx), col = "red")

enter image description here

Not a huge problem but I don't want to have to coerce my xts's every time, or more generally, I'd like to know what's going on here in case there are other issues which this might uncover.

Community
  • 1
  • 1
Thomas Browne
  • 23,824
  • 32
  • 78
  • 121

3 Answers3

8

An xts object is a matrix plus an index, so you can't just pass the object to boxplot(). If you look at str(xx):

# An ‘xts’ object from 2013-06-07 to 2013-06-16 containing:
#   Data: num [1:10, 1:3] 0.321 -0.462 1.715 0.575 0.83 ...
# - attr(*, "dimnames")=List of 2
# ..$ : NULL
# ..$ : chr [1:3] "a" "b" "c"
# Indexed by objects of class: [Date] TZ: 
#   xts Attributes:  
#   NULL

You can access the matrix through coredata():

coredata(xx)
#                a           b            c
# [1,]  0.32120813 -0.07370657 -0.601288169
# [2,] -0.46154742 -1.09475940  3.028664653
# [3,]  1.71515544 -0.31000454 -0.009281175
# [4,]  0.57482616 -0.06260991  1.198034802
# [5,]  0.83015688 -2.49614565 -1.689812377
# [6,]  0.01748081 -0.55332675  2.391426111
# [7,]  0.69852800 -0.10337251 -0.267939285
# [8,]  0.75139113 -0.17427970 -0.561434122
# [9,] -0.68942598  0.18685817 -1.508917140
# [10,] -0.76381007 -2.44387628  0.290524821

Which you can use directly however you would use a matrix:

boxplot(coredata(xx))

enter image description here

If you want to use the index of the xts object, you just use index():

index(xx)
# [1] "2013-06-07" "2013-06-08" "2013-06-09" "2013-06-10" "2013-06-11" "2013-06-12" "2013-06-13" "2013-06-14" "2013-06-15"
# [10] "2013-06-16"
alexwhan
  • 15,636
  • 5
  • 52
  • 66
  • Okay thanks. This explains the issue nicely. I guess in daily use xts objects behave so similarly to matrices that I assumed they'd "just work" with boxplots. As long as I understand why they don't, I get an insight also into what other issues I can encounter in the future, helping with debugging. – Thomas Browne Jun 16 '13 at 14:39
3

Because theres no boxplot.xts function. Write it, and magically you can do boxplot(anxtsobject). If the author of xts likes it, it might even get into the package. Oh, that might only be true if xts are S3 classes...

Can you do hist(anxtsobject)?

Spacedman
  • 92,590
  • 12
  • 140
  • 224
  • +1! for the "Oh, that might only be true if xts are S3 classes..." For the `hist` you can do something like `chart.Histogram(anxtsobject)`... – agstudy Jun 16 '13 at 11:34
3

You can use PerformanceAnalytics package like this for example:

library(PerformanceAnalytics)
chart.Boxplot(xx)

enter image description here

Internally , the xts object is coerced to a data.frame, then boxplot can be called:

library(PerformanceAnalytics)
R <- checkData(xx, method = "data.frame")
boxplot(R)
agstudy
  • 119,832
  • 17
  • 199
  • 261