Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to force specific order of the variables on the X axis?

Tags:

r

ggplot2

My question has to do with order of plot bars when using ggplot.

EffectNames = c("Pull Back(A)","Hook(B)","Peg(C)","AB","BC","AC","ABC")
Half_Effect = c(10.4, 6.5, 5.6, 1.6, 0.98, .77, .65)
paretoData = cbind(EffectNames, Half_Effect)
paretoData = as.data.frame(paretoData)

ggplot(paretoData, aes(x = EffectNames, y = Half_Effect)) +
    geom_bar(stat = "identity") +
    geom_text(aes(label = Half_Effect), vjust = 1.5, colour = "white")

Result: Bar heights are in following order

1.6 0.65 0.77 0.98    6.5    5.6        10.4
 AB  ABC   AC   BC Hook(B) Peg(C) PullBack(A)

Bar heights are not in order seen in Half_Effect. How to force ordering of EffectNames to match descending order of Half_Effect? Can this be done in ggplot2? Yes it can! See solution below.

EffectNames=c( "Pull Back(A)","Hook(B)", "Peg(C)","AB", "BC", "AC", "ABC")
Half_Effect=c( 10.4,6.5,5.6,1.6,0.98,.77,.65 )
paretoData=data.frame(EffectNames, Half_Effect)
paretoData
paretoData$EffectNames = factor(paretoData$EffectNames, 
    levels=c("Pull Back(A)","Hook(B)", "Peg(C)","AB", "BC", "AC", "ABC"))
p=ggplot(paretoData, aes(x=EffectNames, y=Half_Effect)) +
geom_bar(stat="identity") +
geom_text(aes(label=Half_Effect), vjust=1.5, colour="white")
p
like image 533
Mary A. Marion Avatar asked Oct 23 '16 03:10

Mary A. Marion


People also ask

How do you decide which variable to put on the x-axis?

The independent variable belongs on the x-axis (horizontal line) of the graph and the dependent variable belongs on the y-axis (vertical line). The x and y axes cross at a point referred to as the origin, where the coordinates are (0,0).

How do I change the order of data in ggplot2?

To reorder the boxplot we will use reorder() function of ggplot2. By default, ggplot2 orders the groups in alphabetical order.

How do I rearrange the order of a bar chart in R?

The reorder function is used here to change the order of the graphs. Here if you want ascending order then you'll use '+' plus sign, if you want in descending order then you should use '-' minus sign. Note: Column2 must be the column with numeric data.


1 Answers

Elaborating eipi10's comment, the reordering of levels can by accomplished conveniently using Hadley's forcats package. In addition, the reordering can be done within the call to aes() instead of manipulating the underlying data. This offers additional flexibilty in finding a suitable graphical display.

Initial plot

paretoData <-  data.frame(
  EffectNames = c("Pull Back(A)", "Hook(B)", "Peg(C)", "AB", "BC", "AC", "ABC"), 
  Half_Effect = c(10.4, 6.5, 5.6, 1.6, 0.98, .77, .65))

library(ggplot2)
p <- ggplot(paretoData, aes(x = EffectNames, y = Half_Effect)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = Half_Effect), vjust = 1.5, colour = "white")
p

enter image description here

Here, the order is alphabetical by default.

Reorder the levels in order of first appearance

library(forcats)
p + aes(x = fct_inorder(EffectNames))

enter image description here

  • The factors are ordered by their first appearance in the vector (which probably was choosen intentionally by the OP with respect to the value of Half_Effect, so no real surprise here.)
  • In this example, fct_inorder() saves us from typing the same stuff twice which would be required when explicitely specifying the levels in a call to factor.
  • The plot p was modified by only changing the x aesthetics. The underlying data needn't to be touched.

Reorder the levels according to another variable

p + aes(x = fct_reorder(EffectNames, Half_Effect))

enter image description here

Here, the levels are ordered by increasing value of Half_Effect. We could have achieved the same effect by using reorder() from base R instead of fct_reorder().

To show the levels in decreasing order as requested by the OP we can do

p + aes(x = fct_reorder(EffectNames, Half_Effect, .desc = TRUE))

enter image description here

Note that reorder() has no explicit parameter to reverse the order so we would need to modify the controlling variable reorder(EffectNames, -Half_Effect).

like image 173
Uwe Avatar answered Sep 20 '22 20:09

Uwe