[R] Using barplot() with zoo -- names.arg not permitted?
Gabor Grothendieck
ggrothendieck at gmail.com
Thu Mar 17 15:23:33 CET 2011
On Thu, Mar 17, 2011 at 9:38 AM, David Wolfskill <david at catwhisker.org> wrote:
> I've used barplot(), including the anmes.arg parameter, on data frames
> successfully, but I'm even newer to using zoo than I am to R. :-}
>
> I am working on a functon that accepts a data frame ("df") as its
> primary argument, extracts information from it to create a zoo, then
> generates a plot based on that.
>
> The data frame has a column called "time" which is a standard UNIX time
> -- the number of seconds since 01 Jan 1970 (UTC), so I treat that as a
> POSIXct. (The types of the other columns in the data frame varies
> greatly, and the sequence in which they occur is not expected to be
> constant. Thus, I find it easier to let R make a reasonable guess as to
> the data type, and override special cases -- such as "time" -- on an
> individual basis.)
>
> The data frame contains certain columns whose values are counters, so I
> generate a zoo of the diff():
>
> oid = "kern.cp_time_"
> pat = paste("^", oid, sep = "")
> class(df$time) <- "POSIXct"
> df_d <- diff(zoo(df[, grep(pat, names(df))], order.by = df$time))
>
> I then save the start & end timestamps for future reference, and
> generate another zoo, this one containing only the percentages from
> df_d:
>
> cpu_states <- c("sys", "intr", "user", "nice", "idle")
> d_range <- range(index(df_d))
> df_pct <- sweep(df_d, 1, apply(df_d, 1, sum), "/")[, paste(oid, cpu_states[1:4], sep = "")] * 100
>
> Well, that is, I save the percentages in which I'm interested.
>
> So far, so good. df_pct is a zoo (as expected, and the content looks
> reasonable.
>
> I then plot it, e.g.:
>
> barplot(df_pct, border = NA, col = colvec, space = 0, main = title,
> sub = sub, ylab = "CPU %", ylim = c(0, 100), xlab = "Time")
>
> But the X-axis labels show up as "large integers" -- the POSIXct values
> are apparently treated as numeric quantities for this purpose.
>
> And if I try
>
> barplot(df_pct, border = NA, col = colvec, space = 0, main = title,
> sub = sub, ylab = "CPU %", ylim = c(0, 100), xlab = "Time",
> names.arg = index(df_pct))
>
> I am told:
>
> 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
>
> which I find a bit perplexing.
>
> If I plot via:
>
> barplot(df_pct, border = NA, col = col_vec, space = 0, main = title,
> sub = sub, ylab = "CPU %", ylim = c(0, 100), x lab = "Time",
> axisnames = FALSE)
>
> that works OK, but then I'm unable to generate a human-readable set
> of X-axis labels: At best, I'm able to get a single label at the origin.
>
> Here's an excerpt from the generated df_d:
> Browse[2]> df_d[1:10]
> kern.cp_time_idle kern.cp_time_intr kern.cp_time_nice
> 1297278017 275 0 0
> 1297278018 231 0 0
> 1297278019 266 1 0
> 1297278020 230 2 0
> 1297278021 191 0 0
> 1297278022 114 0 0
> 1297278023 30 0 0
> 1297278024 0 0 0
> 1297278025 0 0 0
> 1297278026 0 0 0
> kern.cp_time_sys kern.cp_time_user
> 1297278017 8 1
> 1297278018 17 35
> 1297278019 10 6
> 1297278020 28 24
> 1297278021 21 72
> 1297278022 27 147
> 1297278023 43 219
> 1297278024 47 249
> 1297278025 41 259
> 1297278026 8 15
>
>
> Here's a excerpt from the generated df_pct:
>
> Browse[2]> df_pct[1:10]
> kern.cp_time_sys kern.cp_time_intr kern.cp_time_user
> 1297278017 2.816901 0.0000000 0.3521127
> 1297278018 6.007067 0.0000000 12.3674912
> 1297278019 3.533569 0.3533569 2.1201413
> 1297278020 9.859155 0.7042254 8.4507042
> 1297278021 7.394366 0.0000000 25.3521127
> 1297278022 9.375000 0.0000000 51.0416667
> 1297278023 14.726027 0.0000000 75.0000000
> 1297278024 15.878378 0.0000000 84.1216216
> 1297278025 13.666667 0.0000000 86.3333333
> 1297278026 34.782609 0.0000000 65.2173913
> kern.cp_time_nice
> 1297278017 0
> 1297278018 0
> 1297278019 0
> 1297278020 0
> 1297278021 0
> 1297278022 0
> 1297278023 0
> 1297278024 0
> 1297278025 0
> 1297278026 0
>
>
> I'm using:
>
> R version 2.12.2 (2011-02-25)
>
> in a FreeBSD 8.2-STABLE #125 r219696: Wed Mar 16 04:19:54 PDT 2011
> environment.
>
> I'm willing to share the function (in its current state) and a sample
> data set (~90KB), but didn't think it would be appropriate to spam the
> list with either at this point.
>
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.
--
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