Re: [R] Stacked Area chart

From: Duncan Mackay <>
Date: Wed 17 Aug 2005 - 11:11:14 EST

At 16:03 16/08/05, Mike Saunders wrote:
>I wish to do a stacked area chart to show how relative proportions of
>species within a stand have changed over time.
>I know this is simple, but can someone point me to the right function (if
>it exists). I have not had any luck finding it in the R-help, but maybe I
>am searching using the wrong keywords.
>Mike Saunders
>Research Assistant
>Forest Ecosystem Research Program
>Department of Forest Ecosystem Sciences
>University of Maine
>Orono, ME 04469
>207-581-2763 (O)
>207-581-4257 (F)
> [[alternative HTML version deleted]]
> mailing list
>PLEASE do read the posting guide!

I recently did some graphs using xyplot in lattice where I had the data ordered by days,
the groups argument and possibly by condition.

I have slightly reduced the code for general use and re run it

The process is to create a matrix of cumulative data (xy) and to make a filled polygon for each of the
groups using the previous group value as the lower limit of the polygon. For the first group there has to be a dummy lower limit in these cases of zero ie rep(0,5) in the single panel graph in the rbind sequence Plotting of a group line is referred to as j+1 row due to the fact that there is a dummy
line for the lower polygon of the first group

The first script is for a single graph where there were the groups (codeno) were 4 species.
The days were 1,2,4,6,9 and the y values (comp ) were percentages.

All groupings and conditions are numeric for both datasets Any NAs were converted to 0s so as not to give error messages etc.

The second script is for a conditioned graph of similar data but is generalised.

The maximum y limit can cause problems in setting. In these cases I had a good idea of what they would be. For count data it would be necessary to first do a calculation to find it.

# Single panel
xyplot(comp ~ days, data = stackln,

        as.table = T,
        groups = codeno,
        subscripts = T,
        panel= function(x,y,subscripts,groups)
          xy <- rbind(rep(0,5), apply(sapply(1:4, function(j) 
          for(j in 1:4){
                      grid.polygon(x = c(c(1,2,4,6,9), rev(c(1,2,4,6,9)) ),
                                   y = c(xy[(j+1),],rev(xy[(j),]) ),
                                   gp = gpar(col = 0, fill = c(1,2,6,8)[j]),
                                   default.units = "native")



# Conditioned panel
xyplot(comp ~ days|grps3, data = in1,

        as.table = T,
        groups = codeno,
        subscripts = T,
        panel = function(x,y,subscripts,groups,panel.number)
  <- sort(unique(groups[subscripts]) )

           x.vals <- sort(unique(x))

           xy <- rbind(rep(0,length(x.vals) ), 
apply(sapply(1:length(, function(j) y[groups[subscripts][j]]),1,cumsum))
           for (j in 1:length(
             grid.polygon(x = c(x.vals, rev(x.vals) ),
                          y = c(xy[(j+1),], rev(xy[(j),]) ),
                          gp = gpar(col = 0, fill = c(6,1,2,5,3,4,7,8)[j]),
                          default.units = "native")
           }  # for (j in 1:length(

        } # panel



Duncan Mackay
(The other Duncan Mackay)

Duncan Mackay
Dept of Agronomy and Soil Science
University of New England
Email: mailing list PLEASE do read the posting guide! Received on Wed Aug 17 11:18:28 2005

This archive was generated by hypermail 2.1.8 : Sun 23 Oct 2005 - 15:25:28 EST