Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to change stacking order in stacked bar chart in R?

Tags:

r

ggplot2

I have a dataset like this:

> ra
   quality     GY         TH         SZ         DZ         FP
1        B 25.5932389 23.0215577 21.2171520 23.7548859 19.9848602
2        F 13.9567819 15.8975387 16.0363831 14.4732136 16.4207350
3        M 11.7333000 10.5075000 11.1540000 12.1292000 12.9683000
4        A  8.6439000  7.8888000  8.5094000 10.4722000 11.2059000
5        G  7.8351008  8.8121504  7.9458840  8.0838209  7.5143706
6        E  8.2900000  8.2760000 10.2717000  7.0575000  6.8747000
7        J  6.0596430  6.4356378  5.4962929  5.1445980  5.8653262
8        D  3.8608517  3.9147685  4.1381946  4.1741180  5.5412901
9        C  4.3277000  5.4838000  5.1141000  5.4004000  4.1820000
10       I  3.1710598  3.9339386  3.4053352  3.1940577  3.5347168
11       K  1.2021144  1.3921565  1.8472827  1.4427867  1.3838249
12       L  1.0986329  0.7424060  1.0648934  1.1323864  0.8811604
13       H  0.9369271  0.8795013  0.9792861  0.8986281  0.8585596
14   other  3.2907496  2.8142444  2.8200960  2.6422047  2.7842562

I tried to plot it in R:

ra <- read.table("stack_data.txt", header = T)
library(reshape2)
library(ggplot2)
ra.melt <- melt(ra)
head(ra.melt)
# Output
  quality variable     value
1       B       GY 25.593239
2       F       GY 13.956782
3       M       GY 11.733300
4       A       GY  8.643900
5       G       GY  7.835101
6       E       GY  8.290000
p <- ggplot(ra.melt, aes(x = variable, y = value))
p + geom_bar(aes(fill = quality), stat = "identity") + 
  labs(x = "group", y = "percentage (%)")

enter image description here I want "group" and "quality" both in the exact order as in the original data. It turned out that "group" (used as x) was OK but "quality" (used to stack the bar) was in alphabetic order. How could I change the stacking order to match its original order? And if possible, I prefer not modify the order manually.

like image 766
YT Li Avatar asked Sep 27 '22 07:09

YT Li


1 Answers

I think quality is stacked in the original order: B, F, M and so on. I suppose it is the order of the legend what you'd like to change:

ra.melt$quality <- factor(ra.melt$quality, levels = ra$quality)
p <- ggplot(ra.melt, aes(x = variable, y = value))
p + geom_bar(aes(fill = quality), stat = "identity") + 
    labs(x = "group", y = "percentage (%)")

enter image description here

Or in reverse order:

ra.melt$quality <- factor(ra.melt$quality, levels = rev(ra$quality))
p <- ggplot(ra.melt, aes(x = variable, y = value))
p + geom_bar(aes(fill = quality), stat = "identity") +  
    labs(x = "group", y = "percentage (%)")

enter image description here

Notes

The legend takes the levels of the factor, which are sorted alphabetically by default:

levels(ra.melt$quality)
# Output
 [1] "A"     "B"     "C"     "D"     "E"     "F"     "G"     
     "H"     "I"     "J"     "K"     "L"     "M"     "other"

With ra.melt$quality <- factor(ra.melt$quality, levels = ra$quality) we set the order of the levels of the factor as they originally occur in the vector:

levels(ra.melt$quality)
#Output:
[1] "B"     "F"     "M"     "A"     "G"     "E"     "J"   
    "D"     "C"     "I"     "K"     "L"     "H"     "other"
like image 102
mpalanco Avatar answered Oct 04 '22 23:10

mpalanco