2
votes

This is my CSV file:

Number,inst,pour,Type
One Smell,450,66.96%,OO smells
One Smell,237,36.18%,Both
One Smell,255,49.71%,Android-specific smells
Two Smells,160,16.22%,OO smells
Two Smells,143,21.83%,Both
Two Smells,109,31.19%,Android-specific smells
Three Smells,109,16.64%,Both
Three Smells,61,7.29%,OO smells
Three Smells,49,11.89%,Android-specific smells
Four Smells,66,10.08%,Both
Four Smells,33,6.24%,Android-specific smells
Four Smells,32,4.91%,OO smells
Five Smells,35,5.34%,Both
Five Smells,24,3.57%,OO smells
Five Smells,4,0.78%,Android-specific smells
Six Smells,22,3.36%,Both
Six Smells,7,1.04%,OO smells
Six Smells,1,0.19%,Android-specific smells
Seven smells,17,2.60%,Both
Eight smells,14,2.14%,Both
Nine Smells,9,1.37%,Both
Ten smells,2,0.31%,Both
Eleven smells,1,0.15%,Both

I'm grouping according to Type (Android-specific smell, OO smell, Both) and here is the result:

enter image description here

This is the code:

library(ggplot2)
theme_set(theme_classic())

# Plot

g <- ggplot(Co.oooa, aes(x=reorder(Number, inst), y=inst, fill=Type))+


  theme(axis.text.x = element_text(angle=0, vjust=0.67, size = 10), axis.text.y  = element_text(angle=0, vjust=0.6, size=10))
g + geom_bar(stat="identity", width = 0.57, position ="dodge" )+  

  geom_text(aes(label=pour, group=Type), position=position_dodge(width=0.67), hjust=0.0001, size=2.5 )+

  scale_fill_manual(values=c( "gray", "royalblue1", "red"))+

  coord_flip()

I need to re-order bars according to their length. for example for one smell the first bar should be OO smells then Android-specific smells and finally Both.

1
Could you please make your question reproducible? Please don’t use images data as they cannot be used without a lot of unnecessary effort. minimal reproducible example gives guidance on providing data to a question.Peter
@DavideBrex thanks but that help for a simple barplot but for grouped barplot it does not workOumayma Hamdi
I had the same problem and I found this post more helpful than the other ones.Paul

1 Answers

0
votes

I had the same problem and combined two posts to solve it.

  • See this one to order fill-categories within x-categories ;
  • And this one to order x-categories. Note that they are MANY stackoverflow questions related to sorting bars in geom_bar().

It is possible to achieve this using a new ordered factor. Please find below a piece of code that creates the plot you want:

Co.oooa = Co.oooa %>% 
  arrange(Number, inst) %>% 
  mutate(group_var = factor(paste(Number, Type), levels = paste(Number, Type)))

# 2nd: use aes(group = group_var) along with fct_reorder() to display your data correctly
ggplot(data = Co.oooa, 
       aes(x = fct_reorder(.f = Number, .x = inst, .fun = sum), 
           y = inst, 
           fill = Type,
           label = pour,
           group = group_var)) +
  geom_bar(stat = "identity",
           width = 0.57,
           position = "dodge") +
  geom_text(
    position = position_dodge(width = 0.67),
    hjust = 0.0001,
    size = 2.5
  ) +
  scale_fill_manual(values = c("gray", "royalblue1", "red")) +
  coord_flip() +
  theme_classic() + 
  theme(axis.text.x = element_text(angle=0, vjust=0.67, size = 10), axis.text.y  = element_text(angle=0, vjust=0.6, size=10))
)

The plot

dput() of the dataset:

Co.oooa <-  structure(list(Number = c("One Smell", "One Smell", "One Smell", 
                                    "Two Smells", "Two Smells", "Two Smells", "Three Smells", "Three Smells", 
                                    "Three Smells", "Four Smells", "Four Smells", "Four Smells", 
                                    "Five Smells", "Five Smells", "Five Smells", "Six Smells", "Six Smells", 
                                    "Six Smells", "Seven smells", "Eight smells", "Nine Smells", 
                                    "Ten smells", "Eleven smells"), inst = c(450L, 237L, 255L, 160L, 
                                                                             143L, 109L, 109L, 61L, 49L, 66L, 33L, 32L, 35L, 24L, 4L, 22L, 
                                                                             7L, 1L, 17L, 14L, 9L, 2L, 1L), pour = c("66.96%", "36.18%", "49.71%", 
                                                                                                                     "16.22%", "21.83%", "31.19%", "16.64%", "7.29%", "11.89%", "10.08%", 
                                                                                                                     "6.24%", "4.91%", "5.34%", "3.57%", "0.78%", "3.36%", "1.04%", 
                                                                                                                     "0.19%", "2.60%", "2.14%", "1.37%", "0.31%", "0.15%"), Type = c("OO smells", 
                                                                                                                                                                                     "Both", "Android-specific smells", "OO smells", "Both", "Android-specific smells", 
                                                                                                                                                                                     "Both", "OO smells", "Android-specific smells", "Both", "Android-specific smells", 
                                                                                                                                                                                     "OO smells", "Both", "OO smells", "Android-specific smells", 
                                                                                                                                                                                     "Both", "OO smells", "Android-specific smells", "Both", "Both", 
                                                                                                                                                                                     "Both", "Both", "Both")), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                                                                                   -23L))