Ggplot2, y axis ordering

I have the following data.frame called df . My problem is with y axis order. I want the y-axis names to be ordered according to the depth variable.

If I do this:

 ggplot(df,aes(x=factor(name),y=depth)) + geom_bar(stat='identity') + coord_flip() + labs(y='depth',x='species') 

I got graph1 below which is not ordered. Therefore, I followed the instructions found here , I ordered the levels of my factor name according to depth:

 df2=df[order(df$depth),] df2$name=factor(df2$name,levels=df2$name) ggplot(df2,aes(x=factor(name),y=depth)) + geom_bar(stat='identity') + coord_flip() + labs(y='depth',x='species') 

I got Graph2 below. But the next step for me was to color the columns differently depending on the Mut variable.

 ggplot(df2,aes(x=factor(name),y=depth)) + geom_bar(stat='identity',data=subset(df2,df2$Mut==2),fill='red') + geom_bar(stat='identity',data=subset(df2,df2$Mut==1),fill='blue') + coord_flip() + labs(y='depth',x='species') 

And I got Graph3 , which is no longer ordered !!

How can I create graph 3, following the order displayed in graph 2

  name depth Mut x 25 A_rubrocinctus_GA070 8 2 -0.033318659 9 A_omanensis_GA051 10 2 -0.020387101 4 A_latifasciatus_GA083 12 1 -0.005645811 27 A_frenatus_GA068 12 1 -0.024190876 13 A_percula_GA017 15 1 0.034591721 14 A_percula_GA039 15 2 0.034591721 15 A_percula_GA053 15 2 0.034591721 16 A_ocellaris_GA009 15 1 0.052042539 17 A_ocellaris_GA021 15 1 0.052042539 24 A_ephippium_GA057 15 2 -0.016859412 20 P_biaculeatus_GA008 16 1 -0.014466403 21 P_biaculeatus_GA025 16 1 -0.014466403 22 P_biaculeatus_GA065 16 1 -0.014466403 23 A_melanopus_GA034 18 2 -0.026915545 26 A_melanopus_GA012 18 2 -0.026915545 12 A_sandaracinos_GA018 20 1 0.055839755 6 A_nigripes_GA055 25 1 0.023420045 8 A_sebae_GA029 25 1 0.021767793 11 A_akallopisos_GA067 25 1 0.043272525 28 A_akallopisos_GA072 25 1 0.043272525 34 A_akindynos_GA032 25 1 -0.020707141 1 A_polymnus_GA004 30 1 0.030902254 3 A_allardi_GA033 30 1 -0.020277664 5 A_bicinctus_GA036 30 1 -0.025354572 7 A_polymnus_GA019 30 1 0.030902254 32 A_chrysopterus_GA040 30 1 -0.022402365 33 A_chrysopterus_GA031 30 1 -0.022402365 35 A_perideraion_GA020 38 1 0.052830132 36 A_perideraion_GA015 38 1 0.052830132 2 A_tricinctus_GA058 40 1 -0.016230301 18 A_chrysogaster_GA080 40 1 0.012608835 19 A_chrysogaster_GA077 40 1 0.012608835 10 A_latezonatus_GA023 45 1 -0.010718845 31 A_mccullochi_GA056 45 1 -0.031664307 29 A_clarkii_GA044 60 1 -0.014474658 30 A_clarkii_GA010 60 1 -0.014474658 

Graph1 enter image description here Graph2 enter image description here Graph3 enter image description here Thanks!

+7
r plot order ggplot2
source share
1 answer

Since you have a Mut variable in your data that determines what level each observation belongs to, you do not need to use geom_bar() twice with a subset. Just add fill=factor(Mut) inside aes() and use df2 with the ordered data. The bars will be in the correct order and the color will be done automatically.

 ggplot(df2,aes(x=factor(name),y=depth,fill=factor(Mut))) + geom_bar(stat='identity') + coord_flip() + labs(y='depth',x='species') 

The same result can be achieved using the original df frame and the reorder() function inside aes() for x values.

 ggplot(df,aes(x=reorder(name,depth),y=depth,fill=factor(Mut))) + geom_bar(stat='identity') + coord_flip() + labs(y='depth',x='species') 

enter image description here

+17
source share

All Articles