[R] Stacked bar plot of frequency vs time
Marc Schwartz
marc_schwartz at me.com
Mon Jul 11 17:49:42 CEST 2011
On Jul 11, 2011, at 9:36 AM, marcel wrote:
> Hi All,
> New to R, but committed. I looked in a number of places but can't figure out
> my current problem. I have date of the type:
>
> Time Type1 Type2 Type3
> 1 .50 .25 .25
> 4 .55 .25 .20
> 5 .65 .20 .15
> etc
>
> which describe the frequency of types 1, 2 and 3 (adding up to 100%) over
> time. I would like to create a stacked bar chart showing these frequencies,
> each bar of height = 1, subsections of bars proportional to the frequency,
> and each bar located at the correct X (time) position. One difficulty is
> that the desired spacing of bar locations on the x-axis is irregular. Is
> this possible in R?
>
> Many thanks,
> Marcel
In addition to Rich's solution using lattice, here is one possible approach using base graphics:
> dput(DF)
structure(list(Time = c(1L, 4L, 5L), Type1 = c(0.5, 0.55, 0.65
), Type2 = c(0.25, 0.25, 0.2), Type3 = c(0.25, 0.2, 0.15)), .Names = c("Time",
"Type1", "Type2", "Type3"), class = "data.frame", row.names = c(NA,
-3L))
> DF
Time Type1 Type2 Type3
1 1 0.50 0.25 0.25
2 4 0.55 0.25 0.20
3 5 0.65 0.20 0.15
# Create a newdata frame with a column with the full Time sequence
TimeFill <- data.frame(Time = with(DF, min(Time):max(Time)))
> TimeFill
Time
1 1
2 2
3 3
4 4
5 5
# merge the full sequence and the original DF together. See ?merge
DF2 <- merge(DF, TimeFill, all = TRUE)
> DF2
Time Type1 Type2 Type3
1 1 0.50 0.25 0.25
2 2 NA NA NA
3 3 NA NA NA
4 4 0.55 0.25 0.20
5 5 0.65 0.20 0.15
# Now transpose the columns in DF to the matrix required for the plot
barplot(t(DF2[, -1]), names.arg = DF2$Time)
HTH,
Marc Schwartz
More information about the R-help
mailing list