1

I'm trying to create a stacked area graph with r and ggplot2. I'd like it to look like this, but instead the areas overlap and have holes. I'm trying to ensure that the areas are stacked so that the area with the largest value in the most recent month (2016-05 in this case) are on the bottom.

Related posts like this one seem to have holes in the data, which doesn't seem to be the issue here.

Here's sample code to recreate the issue:

sample.data <- structure(
  list(
    rank = structure(
      c(34L, 34L, 34L, 35L, 35L, 35L, 34L, 34L, 34L, 34L, 35L, 35L, 35L, 35L, 35L, 34L), 
      .Label = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35"), 
      class = "factor"), 
    vendor = structure(
      c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L), 
      .Label = c("34", "35"), 
      class = "factor"), 
    year.month = c("2015-12", "2016-01", "2015-11", "2015-12", "2016-01", "2015-10", "2016-03", "2016-02", "2015-10", "2016-04", "2015-11", "2016-05", "2016-04", "2016-03", "2016-02", "2016-05"), 
    value = c(431616L, 272224L, 229288L, 195284L, 155168L, 154194L, 149784L, 137302L, 126612L, 117408L, 94141L, 56161L, 54606L, 53173L, 49898L, 45348L)), 
  .Names = c("rank", "vendor", "year.month", "value"), 
  row.names = c(6L, 8L, 4L, 5L, 7L, 1L, 12L, 10L, 2L, 14L, 3L, 15L, 13L, 11L, 9L, 16L), 
  class = "data.frame"
)

ggplot(data = sample.data, aes(x = year.month, y = value, group = vendor, color = vendor, reorder(-value), fill=vendor)) +
  geom_area() 

Thanks in advance for your help.

Matt
  • 11
  • 1

2 Answers2

0

Try: + geom_area(position="dodge",stat="identity")

shu251
  • 241
  • 1
  • 4
  • 14
0

The following works:

ggplot(data = sample.data[order(sample.data$vendor),], 
       aes(x = year.month, y = value, group = vendor, color = vendor, 
           reorder(-value), fill=vendor)) + geom_area()

You just had to order your data: sample.data[order(sample.data$vendor),].

If you want to change the order of the graph, you have to "relevel" the vendor variable which is stored as a factor:

sample.data$vendor <- relevel(sample.data$vendor, ref="35")

Here is some code to figure out what vendor to set as the base level according to your criterion:

with(sample.data, sample.data[year.month=="2016-05", 
                        "vendor"][which.max(sample.data[year.month=="2016-05", "value"])])
lmo
  • 37,904
  • 9
  • 56
  • 69
  • Thanks for the quick response! I think that's really close, but I'm trying to ensure that the areas are stacked so that the area with the largest value in the most recent month (2016-05 in this case) is on the bottom. I tried substituting "value" in for "vendor" in a couple places, but that doesn't seem to work. – Matt May 12 '16 at 20:57
  • Because your vendor variable is a factor, you need to use `relevel` to achieve this. See my code above. – lmo May 12 '16 at 21:14