[R] Using barplot() with zoo -- names.arg not permitted?

Gabor Grothendieck ggrothendieck at gmail.com
Fri Mar 18 00:52:29 CET 2011


On Thu, Mar 17, 2011 at 4:54 PM, David Wolfskill <r at catwhisker.org> wrote:
> On Thu, Mar 17, 2011 at 10:23:33AM -0400, Gabor Grothendieck wrote:
>> On Thu, Mar 17, 2011 at 9:38 AM, David Wolfskill <r at catwhisker.org> wrote:
>> ...
>> > But the X-axis labels show up as "large integers" -- the POSIXct values
>> > are apparently treated as numeric quantities for this purpose.
>> ...
>> Please cut this all down to as small a reproducible example as you can
>> manage and place it all in ***one*** code section that also generates
>> the data so that we can copy a single section of code from your post
>> to R.  Use dput to convert data to code for this purpose.
>
> Thank you for that.  :-)
>
> The data below is a bit larger than absolutely necessary, but its
> much smaller than what I would normally be using -- and I was able
> to paste this into R directly (on a different machine, getting the
> same results), so I believe it will suffice.
>
> As a benefit, after going through this, I did manage to find an
> invocation that is able to generate an acceptable X-axis -- at
> least, sometimes.  (Changing the size of the X11 window appears to
> mess things up -- at least.)  But this seems rather more complicated
> than I expected.
>
> Anyway, here's a cut/paste of the requested code section:
>
> df <- structure(list(time = c(1297278016L, 1297278017L, 1297278018L,
> 1297278019L, 1297278020L, 1297278021L, 1297278022L, 1297278023L,
> 1297278024L, 1297278025L, 1297278026L, 1297278027L, 1297278028L,
> 1297278029L, 1297278030L, 1297278031L, 1297278032L, 1297278033L,
> 1297278034L, 1297278035L, 1297278036L, 1297278037L, 1297278038L,
> 1297278039L, 1297278040L, 1297278041L, 1297278042L, 1297278043L,
> 1297278044L, 1297278045L, 1297278046L, 1297278047L, 1297278048L,
> 1297278049L, 1297278050L, 1297278051L, 1297278054L, 1297278055L,
> 1297278056L, 1297278057L, 1297278058L, 1297278059L, 1297278060L,
> 1297278061L, 1297278062L, 1297278063L, 1297278064L, 1297278065L,
> 1297278066L, 1297278067L, 1297278068L, 1297278069L, 1297278070L,
> 1297278071L, 1297278072L, 1297278073L, 1297278074L, 1297278075L,
> 1297278076L, 1297278077L, 1297278078L, 1297278079L, 1297278080L,
> 1297278081L, 1297278082L, 1297278083L, 1297278084L, 1297278085L,
> 1297278086L, 1297278087L, 1297278088L, 1297278089L, 1297278090L,
> 1297278091L, 1297278092L, 1297278093L, 1297278094L, 1297278095L,
> 1297278096L, 1297278097L, 1297278098L, 1297278099L, 1297278100L,
> 1297278101L, 1297278102L), kern.cp_time_idle = c(3193265L, 3193540L,
> 3193771L, 3194037L, 3194267L, 3194458L, 3194572L, 3194602L, 3194602L,
> 3194602L, 3194602L, 3194602L, 3194603L, 3194607L, 3194617L, 3194672L,
> 3194802L, 3194933L, 3195067L, 3195225L, 3195378L, 3195378L, 3195418L,
> 3195418L, 3195418L, 3195419L, 3195419L, 3195421L, 3195422L, 3195422L,
> 3195422L, 3195422L, 3195422L, 3195450L, 3195450L, 3195664L, 3196432L,
> 3196440L, 3196871L, 3196872L, 3196874L, 3196944L, 3196944L, 3197037L,
> 3197130L, 3197130L, 3197132L, 3197159L, 3197159L, 3197162L, 3197166L,
> 3197236L, 3197367L, 3197367L, 3197497L, 3197639L, 3197782L, 3197922L,
> 3197946L, 3197947L, 3197954L, 3197954L, 3197954L, 3198194L, 3198194L,
> 3198204L, 3198205L, 3198256L, 3198265L, 3198269L, 3198269L, 3198269L,
> 3198269L, 3198269L, 3198270L, 3198270L, 3198270L, 3198270L, 3198270L,
> 3198270L, 3198270L, 3198323L, 3198323L, 3198367L, 3198631L),
>    kern.cp_time_intr = c(5142L, 5142L, 5142L, 5143L, 5145L,
>    5145L, 5145L, 5145L, 5145L, 5145L, 5145L, 5145L, 5145L, 5145L,
>    5145L, 5145L, 5145L, 5145L, 5145L, 5145L, 5145L, 5145L, 5145L,
>    5145L, 5145L, 5145L, 5145L, 5145L, 5145L, 5145L, 5145L, 5145L,
>    5146L, 5147L, 5147L, 5147L, 5148L, 5148L, 5149L, 5150L, 5152L,
>    5152L, 5152L, 5153L, 5153L, 5155L, 5156L, 5156L, 5156L, 5156L,
>    5156L, 5156L, 5156L, 5156L, 5156L, 5156L, 5156L, 5156L, 5156L,
>    5156L, 5156L, 5156L, 5156L, 5156L, 5157L, 5157L, 5157L, 5157L,
>    5157L, 5157L, 5157L, 5157L, 5157L, 5157L, 5157L, 5157L, 5157L,
>    5157L, 5157L, 5157L, 5157L, 5157L, 5157L, 5157L, 5157L),
>    kern.cp_time_nice = c(36L, 36L, 36L, 36L, 36L, 36L, 36L,
>    36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L,
>    36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L,
>    36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L,
>    36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L,
>    36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L,
>    36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L, 36L,
>    36L, 36L, 36L, 36L, 36L, 36L), kern.cp_time_sys = c(132583L,
>    132591L, 132608L, 132618L, 132646L, 132667L, 132694L, 132737L,
>    132784L, 132825L, 132833L, 132881L, 132933L, 132977L, 133017L,
>    133059L, 133093L, 133121L, 133147L, 133172L, 133210L, 133220L,
>    133259L, 133302L, 133342L, 133388L, 133431L, 133494L, 133547L,
>    133557L, 133592L, 133631L, 133673L, 133713L, 133765L, 133785L,
>    133798L, 133808L, 133816L, 133857L, 133892L, 133951L, 133960L,
>    134004L, 134043L, 134109L, 134170L, 134206L, 134268L, 134329L,
>    134396L, 134443L, 134486L, 134501L, 134558L, 134611L, 134654L,
>    134704L, 134743L, 134789L, 134824L, 134871L, 134881L, 134898L,
>    134929L, 134994L, 135038L, 135071L, 135126L, 135202L, 135277L,
>    135292L, 135372L, 135440L, 135497L, 135565L, 135623L, 135639L,
>    135680L, 135730L, 135777L, 135825L, 135834L, 135884L, 135899L
>    ), kern.cp_time_user = c(545975L, 545976L, 546011L, 546017L,
>    546041L, 546113L, 546260L, 546479L, 546728L, 546987L, 547002L,
>    547256L, 547498L, 547740L, 547980L, 548171L, 548293L, 548418L,
>    548542L, 548645L, 548753L, 548762L, 548973L, 549232L, 549510L,
>    549761L, 550018L, 550243L, 550541L, 550555L, 550815L, 551073L,
>    551354L, 551583L, 551827L, 551883L, 551893L, 551893L, 551893L,
>    552149L, 552407L, 552566L, 552575L, 552723L, 552901L, 553119L,
>    553343L, 553568L, 553796L, 554020L, 554237L, 554419L, 554530L,
>    554533L, 554630L, 554725L, 554823L, 554919L, 555148L, 555411L,
>    555673L, 555938L, 555962L, 555997L, 556261L, 556480L, 556725L,
>    556927L, 557157L, 557377L, 557616L, 557641L, 557919L, 558143L,
>    558379L, 558625L, 558877L, 558921L, 559194L, 559476L, 559723L,
>    559940L, 559961L, 560151L, 560156L)), .Names = c("time",
> "kern.cp_time_idle", "kern.cp_time_intr", "kern.cp_time_nice",
> "kern.cp_time_sys", "kern.cp_time_user"), class = "data.frame", row.names = c(NA,
> -85L))
> class(df$time) <- "POSIXct"
> oid = "kern.cp_time_"
> pat = paste("^", oid, sep = "")
> col_vec = c("red", "yellow", "green", "blue")
> cpu_states <- c("sys", "intr", "user", "nice", "idle")
> require(zoo)
> df_d <- diff(zoo(df[, grep(pat, names(df))], order.by = df$time))
> d_range <- range(index(df_d))
> sub <- paste("[", strftime(d_range[1], format = "%c"), "-",
>  strftime(d_range[2], format = "%c"), "]")
> df_pct <- sweep(df_d, 1, apply(df_d, 1, sum), "/")[, paste(oid, cpu_states[1:4], sep = "")] * 100
> title <- "make -j4 -DNOCLEAN buildworld"
> barplot(df_pct, border = NA, col = col_vec, space = 0, main = title,
>  sub = sub, ylab = "CPU %", ylim = c(0, 100), xlab = "Time")
> barplot(df_pct, border = NA, col = col_vec, space = 0, main = title,
>  sub = sub, ylab = "CPU %", ylim = c(0, 100), xlab = "Time",
>  names.arg = index(df_d))
> traceback()
> barplot(df_pct, border = NA, col = col_vec, space = 0, main = title,
>  sub = sub, ylab = "CPU %", ylim = c(0, 100), xlab = "Time",
>  axisnames = FALSE)
> axis.POSIXct(1, index(df_d))
> barplot(df_pct, border = NA, col = col_vec, space = 0, main = title,
>  sub = sub, ylab = "CPU %", ylim = c(0, 100), xlab = "Time",
>  axisnames = FALSE)
> axis(1, at = pretty(index(df_d)) - as.numeric(d_range[1]),
>  labels = strftime(as.POSIXct(pretty(index(df_d)),
>  origin = "1970-01-01", tz = "UTC"), format = "%X"))
>
>
>
> Some comments:
> * The first attempt (barplot invoked with default X-axis labels)
>  yields X-axis labels:
>  1297278017   1297278035   1297278055   1297278073   1297278091
>
> * The second (barplot() invoked with "names.arg = index(df_d)" yielded
>  the same default X-axis labels, along with:
> Warning messages:
> 1: In plot.window(xlim, ylim, log = log, ...) :
>  "names" is not a graphical parameter
> 2: In axis(if (horiz) 2 else 1, at = at.l, labels = names.arg, lty = axis.lty,  :
>  "names" is not a graphical parameter
> 3: In title(main = main, sub = sub, xlab = xlab, ylab = ylab, ...) :
>  "names" is not a graphical parameter
> 4: In axis(if (horiz) 1 else 2, cex.axis = cex.axis, ...) :
>  "names" is not a graphical parameter
>> traceback()
> No traceback available
>
> * The third attempt (invoking barplot() with "axisnames = FALSE",
>  then invoking "axis.POSIXct(1, index(df_d))") yielded an X-axis label:
>  59:56
>
> * The fourth attempt (invoking barplot() with "axisnames = FALSE",
>  then invoking "axis()" after studying "axis.POSIXct" for a bit
>  (to try to use the parts of it that seemed to be useful for my
>  present purposes) yielded X-axis labels:
>  11:00:20    11:00:40    11:01:00    11:01:20    11:01:4
>
>  As thos times reflect my timezone, there will likely be differences
>  (explainable by that observation) for others.
>
>
> I hope to learn what I'm misunderstanding.
>
> I suspect that some of this may be "cultural," in a sense: I work
> almost exclusively in UNIX (FreeBSD) environments, and am accustomed
> to using (what R calls a) "POSIXct" as my preferred form for
> date/timestamps for manipulatio0n; the apparent (frequent) requirement
> that I specify the "origin" feels bizarre, as it's always 01 Jan 1970
> 00:00:00 UTC.  Thus, when I think of a date/time stamp, I tend to think
> in terms of time_t, and think of other representations as just that:
> merely representations of what is "really" a time_t (or POSIXct).  :-}
> (Indeed: I wrote the script that generates the timestamp in the data in
> question; it does that by invoking "date +%s".)
>

This line in the code above produces an invalid object:
class(df$time) <- "POSIXct"

It should be:
class(df$time) <- c("POSIXct", "POSIXt")

Also there is a bug in barplot.zoo that results in a bunch of warnings
(although it still produces the correct result).  You can workaround
it by using names= in place of names.arg= .  Doing that will avoid
those warnings.

-- 
Statistics & Software Consulting
GKX Group, GKX Associates Inc.
tel: 1-877-GKX-GROUP
email: ggrothendieck at gmail.com



More information about the R-help mailing list