[R] Stacked Area chart

Duncan Mackay mackay at northnet.com.au
Wed Aug 17 03:11:14 CEST 2005


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.
>
>Thanks,
>Mike
>
>
>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]]
>
>______________________________________________
>R-help at stat.math.ethz.ch mailing list
>https://stat.ethz.ch/mailman/listinfo/r-help
>PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

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) 
y[groups[subscripts]==j]),1,cumsum))
          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)
        {
           grp.no <- sort(unique(groups[subscripts]) )

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

           xy <- rbind(rep(0,length(x.vals) ), 
apply(sapply(1:length(grp.no), function(j) 
y[groups[subscripts]==grp.no[j]]),1,cumsum))

           for (j in 1:length(grp.no))
           {
             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(grp.no))

        } # panel
)


Regards

Duncan Mackay
(The other Duncan Mackay)


Duncan Mackay
Dept of Agronomy and Soil Science
University of New England
ARMIDALE  NSW 2351
Email: dmackay8 at pobox.une.edu.au




More information about the R-help mailing list