Getting a stacked area plot in R

34,631

Solution 1

You can use the ggplot2 package from Hadley Wickham for that.

R> library(ggplot2)

An example data set :

R> d <- data.frame(t=rep(0:23,each=4),var=rep(LETTERS[1:4],4),val=round(runif(4*24,0,50)))
R> head(d,10)
   t var val
1  0   A   1
2  0   B  45
3  0   C   6
4  0   D  14
5  1   A  35
6  1   B  21
7  1   C  13
8  1   D  22
9  2   A  20
10 2   B  44

And then you can use ggplot with geom_area :

R> ggplot(d, aes(x=t,y=val,group=var,fill=var)) + geom_area(position="fill")

enter image description here

Solution 2

You can use stackpoly from the plotrix package:

library(plotrix)
#create proportions table
pdat <- prop.table(xtabs(Prop2~Hour+Category,Dat),margin=1)
#draw chart
stackpoly(pdat,stack=T,xaxlab=rownames(pdat))
#add legend
legend(1,colnames(pdat),bg="#ffffff55",fill=rainbow(dim(pdat)[2]))
Share:
34,631
sfactor
Author by

sfactor

Dreamer, Analyst, Engineer, Programmer, Photographer.

Updated on July 09, 2022

Comments

  • sfactor
    sfactor almost 2 years

    This question is a continuation of the previous question I asked.

    Now I have a case where there is also a category column with Prop. So, the dataset becomes like

    Hour  Category        Prop2
    
    00     A            25
    00     B            59
    00     A            55
    00     C            5
    00     B            50
    ...
    01     C            56
    01     B            45
    01     A            56
    01     B            35
    ...
    23     D            58
    23     A            52
    23     B            50
    23     B            35
    23     B            15
    

    In this case I need to make a stacked area plot in R with the percentages of these different categories for each day. So, the result will be like.

            A         B       C        D
    00     20%       30%     35%       15% 
    01     25%       10%     40%       25%
    02     20%       40%     10%       30% 
    .
    .
    .
    20 
    21
    22     25%       10%     30%       35%
    23     35%       20%     20%       25%
    

    So now I would get the share of each Category in each hour and then plot this is a stacked area plot like this where the x-axis is the hour and y-axis the percentage of Prop2 for each category given by the different coloursthis

  • sfactor
    sfactor about 13 years
    This seems to work and gives me the stack plot, but there are no legends to say which colored stack represents which Category?
  • sfactor
    sfactor about 13 years
    thanks but what about getting the share (percentage or ratio) of each category for each hour from the initial table to the form you show in dataset 'd' here?
  • juba
    juba about 13 years
    Sorry, I didn't see this from your question. In fact I think that ggplot2 can do that for you : I've edited my post to show how to do it.
  • John
    John about 13 years
    You need to sort your categories first so that you know which is which and then make your own legend with the legend() command.
  • sfactor
    sfactor about 13 years
    sorry to bother again you still make an simplification regarding the data, in the initial form there is repetition of the Category for each hour. So, there can be multiple rows of Category A in hour 0, so how do I aggregate each of these category for each hour first to get it into the form that you have shown here?
  • James
    James about 13 years
    @sfactor Added an example legend, read ?legend for more details on how this works
  • Rik Smith-Unna
    Rik Smith-Unna almost 12 years
    For me this bunches up the entire graph to take up just a tiny fraction of the plot area on the right.