Search code examples
rtextxtsquantmod

How to add numbers on top of ChartSeries() bars using r


What I am basically trying to do is to put s$cluster numbers on top of each bar

library("quantmod")

# xts object
s <- 
structure(c(1300, 1301.349976, 1281.199951, 1316.900024, 1312.310059, 
1278, 1304.439941, 1304.709961, 1313.900024, 1323.089966, 1314.98999, 
1301.719971, 1291.630005, 1271.01001, 1281.199951, 1311.040039, 
1288.329956, 1273, 1301.189941, 1287.030029, 1307.890015, 1317.030029, 
1288.959961, 1299.699951, 372300, 453800, 347600, 376400, 488200, 
567300, 1301.189941, 1287.030029, 1307.890015, 1317.030029, 1288.959961, 
1299.699951, 0.0034153392307692, 0.00258192266643587, 0.0255230051909361, 
0.00470038870619693, 0.00204214772387123, 0.0185602276995305, 
-0.00643845769230766, -0.0233142248891853, 0, -0.0044498328599013, 
-0.0182731991083518, -0.00391236306729259, 0.000915339230769252, 
-0.0110039169048249, 0.02083208321946, 9.87204781157658e-05, 
-0.0177931258240853, 0.016979617370892, 4, 3, 1, 4, 3, 1), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", src = "yahoo", updated = structure(1459599733.74441, class = c("POSIXct", 
"POSIXt")), class = c("xts", "zoo"), index = structure(c(1458777600, 
1459123200, 1459209600, 1459296000, 1459382400, 1459468800), tzone = "UTC", tclass = "Date"), .Dim = c(6L, 
10L), .Dimnames = list(NULL, c("PCLN.Open", "PCLN.High", "PCLN.Low", 
"PCLN.Close", "PCLN.Volume", "PCLN.Adjusted", "h", "l", "c", 
"cluster")))

I have tried the following:

# plot
chart_Series(s)

# add text on top of each bar:
text(x = s, y = s$cluster, label = as.character(s$cluster))

I have tried searching online but cannot seem to find the answer for chartSeries() plots. thanks in advance


Solution

  • In the text call, x is supposed to be a numeric vector of the x-coordinates of the location of the text you want to plot, but you provide a xts/matrix. I'd guess that the text call uses the first 6 observations of the first column, since that's how many observations are in your drawn chart. The first 6 values are between 1278 and 1317, which are >> 6, so they don't appear on your drawn plot.

    Similarly, y is supposed to be the y-coordinates of the location of the text you want to plot. You provide a vector with a range between 1 and 4, while the y values on the data you plot are in the 1250-1350 range, so your text coordinates are off the drawn plot.

    The x-coordinates should just be 1:nrow(s) and the y-coordinates should be something close to Lo(s) and Hi(s) for each observation. For example:

    text(x = seq(nrow(s)), y = Hi(s)+1, label = as.character(s$cluster))