Vasilis
Vasilis

Reputation: 2841

Reverse stacking order in ggplot2 geom_order

I'm trying to follow this ggplot2 tutorial (unfrotunately it doesn't have comments to ask my question there) on area plots, but for some reason my output is different that the author's output. I execute the following code:

library(ggplot2) 
charts.data <- read.csv("copper-data-for-tutorial.csv")

p1 <- ggplot() + geom_area(aes(y = export, x = year, fill = product), data = charts.data, stat="identity")

The dataset is the following:

> charts.data
   product year export percentage   sum
1   copper 2006   4176         79  5255
2   copper 2007   8560         81 10505
3   copper 2008   6473         76  8519
4   copper 2009  10465         80 13027
5   copper 2010  14977         86 17325
6   copper 2011  15421         83 18629
7   copper 2012  14805         82 18079
8   copper 2013  15183         80 19088
9   copper 2014  14012         76 18437
10  others 2006   1079         21  5255
11  others 2007   1945         19 10505
12  others 2008   2046         24  8519
13  others 2009   2562         20 13027
14  others 2010   2348         14 17325
15  others 2011   3208         17 18629
16  others 2012   3274         18 18079
17  others 2013   3905         20 19088
18  others 2014   4425         24 18437

When I print the plot my result is:

enter image description here

Instead, the same code exactly in the tutorial shows a plot with the order of the reversed which looks much better because the smaller quantity is on the bottom:

enter image description here

I suspect the author either omited some code or the output is different because we use different ggplot2 versions. How can I change the stacking order to get the same output?

My sessionInfo() is

> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] plyr_1.8.4     extrafont_0.17 ggthemes_3.3.0 ggplot2_2.2.0 

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.8      digest_0.6.10    assertthat_0.1   grid_3.3.2       Rttf2pt1_1.3.4   gtable_0.2.0     scales_0.4.1    
 [8] lazyeval_0.2.0   extrafontdb_1.0  labeling_0.3     tools_3.3.2      munsell_0.4.3    colorspace_1.3-1 tibble_1.2  

Upvotes: 4

Views: 5999

Answers (3)

pachadotdev
pachadotdev

Reputation: 3775

@Vasilis

How about this fully reproducible example? I did prefer to think a little bit before posting some awkward solution.

library(ggplot2)
library(ggthemes)
library(extrafont)
library(forcats)

charts.data.2 <- read.csv("copper-data-for-book.csv")
charts.data.2 <- as.data.frame(charts.data.2)
charts.data.2$product <- factor(charts.data.2$product, levels = c("others","copper"), 
  labels = c("Pulp wood, Fruit, Salmon & Others ","Copper"))

fill <- c("#b2d183","#40b8d0")

p2 <- ggplot() + 
  geom_area(aes(y = export, x = year, fill = product), data = charts.data.2, 
    stat="identity") + 
  scale_x_continuous(breaks=seq(2006,2014,1)) + 
  labs(x="Year", y="USD million") + 
  ggtitle("Composition of Exports to China ($)") + 
  scale_fill_manual(values=fill) + 
  theme(panel.border = element_rect(colour = "black", fill=NA, size=.5), 
    axis.text.x=element_text(colour="black", size = 10), 
    axis.text.y=element_text(colour="black", size = 10),
    legend.key=element_rect(fill="white", colour="white"),
    legend.position="bottom", legend.direction="horizontal", 
    legend.title = element_blank(),
    panel.grid.major = element_line(colour = "#d3d3d3"), 
    panel.grid.minor = element_blank(), 
    panel.background = element_blank(),
    plot.title = element_text(size = 14, family = "Tahoma", face = "bold"), 
    text=element_text(family="Tahoma")) +
  guides(fill = guide_legend(reverse=T))
p2

enter image description here

Upvotes: 1

pachadotdev
pachadotdev

Reputation: 3775

I saw your email. I'm one of the authors of that tutorial. Thanks a lot for asking about my materials.

This is the relevant chunk according to your post

p2 <- ggplot() + geom_area(aes(y = export, x = year, fill = product), 
                           data = charts.data, stat="identity")
p2

Please consider that the tutorial was made with different versions of ggplot2 as we were updating those tutorials and those weren't written in one sit.

The tutorial comes from an Rmd file that show as a plot what the lines of code state.

You can read the evolved form of my older tutorials at https://leanpub.com/ as they evolved into the shape of a book titled "The Hitchhiker's Guide to Ggplot2 in R" I'm telling you that because we updated some parts of the book to see if ggplot2 2.2.0 was generating exactly what we were doing with older ggplot2 versions.

What Nathan Day says is useful but I checked myself twice (just now) and I obtain the same plot as in the tutorial.

This is my sessionInfo()

> sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: OS X 10.11.6 (El Capitan)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ggplot2_2.2.0

loaded via a namespace (and not attached):
 [1] colorspace_1.2-7 scales_0.4.1     assertthat_0.1   lazyeval_0.2.0   plyr_1.8.4      
 [6] tools_3.3.1      gtable_0.2.0     tibble_1.2       Rcpp_0.12.7      grid_3.3.1      
[11] munsell_0.4.3   

Best regards

Upvotes: 1

Nate
Nate

Reputation: 10671

you have two options here, both of which require your aes(fill) to be a factor.

1) change the order of your factor so the desired additive level is first:

df$product %<>% factor(levels= c("others","copper"))

ggplot(data = df, aes(x = year, y = export)) +
    geom_area(aes(fill = product), position = "stack")

enter image description here

2) or keep the factor as is (copper first) and tell position_stack(reverse = TRUE):

df$product %<>% as.factor()
ggplot(data = df, aes(x = year, y = export)) +
    geom_area(aes(fill = product), position = position_stack(reverse = T))

enter image description here

the %<>% is from library(magrittr)

Upvotes: 5

Related Questions