Home > OS >  Control order across factors in ggplot2
Control order across factors in ggplot2

Time:12-07

I have a plot that looks like below. I want to change the order so that the larger value comes first (so cyan would precede red). But I can't seem to do this. What am I doing wrong?

This is my current code block so far:

ggplot(df, aes(x = Gene.Set.Size, y = OR, label =P.value, color = Method, group = Method))  
  geom_point(position=position_dodge(width=0.5))   
  ggrepel::geom_text_repel(size = 6, box.padding = 1, segment.angle = 20, position=position_dodge(width=0.5)) 
  geom_pointrange(aes(ymax = UpperCI, ymin = LowerCI),position=position_dodge(width=0.5))  
  theme_bw()  
  theme(text=element_text(size=25),axis.text.x = element_text(angle = 45, hjust = 1))  
  ylab("Odds ratio")  
  xlab("Gene set size")  
  theme(plot.margin = unit(c(2,2,2,2), "cm")) 

enter image description here

> dput(df)
structure(list(Method = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("MAGMA", 
"Pairwise"), class = "factor"), P.value = c(8.74e-28, 1.33e-56, 
5.57e-92, 1.63e-44, 4.23e-71, 2.78e-95), OR = c(1.39, 1.424668, 
1.4, 1.513, 1.478208, 1.409563), UpperCI = c(1.481491, 1.487065, 
1.446039, 1.601557, 1.417117, 1.455425), LowerCI = c(1.316829, 
1.364601, 1.356358, 1.42, 1.541768, 1.365056), Gene.Set.Size = structure(c(1L, 
2L, 3L, 1L, 2L, 3L), .Label = c("500", "1000", "2000"), class = "factor")), row.names = c(NA, 
-6L), class = "data.frame")

CodePudding user response:

You must set the factor order.

library(ggplot2)
df <- structure(list(Method = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("MAGMA", 
"Pairwise"), class = "factor"), P.value = c(8.74e-28, 1.33e-56, 
5.57e-92, 1.63e-44, 4.23e-71, 2.78e-95), OR = c(1.39, 1.424668, 
1.4, 1.513, 1.478208, 1.409563), UpperCI = c(1.481491, 1.487065, 
1.446039, 1.601557, 1.417117, 1.455425), LowerCI = c(1.316829, 
1.364601, 1.356358, 1.42, 1.541768, 1.365056), Gene.Set.Size = structure(c(1L, 
2L, 3L, 1L, 2L, 3L), .Label = c("500", "1000", "2000"), class = "factor")), row.names = c(NA, 
-6L), class = "data.frame")

#reorder Factor
df$Method = factor(df$Method, levels=c("Pairwise", "MAGMA"))

ggplot(df, aes(x=Gene.Set.Size, y=OR, label=P.value, 
               group= Method, color=Method))   
  geom_point(position=position_dodge(width=0.5))   
  ggrepel::geom_text_repel(size = 6, box.padding = 1, segment.angle = 20, position=position_dodge(width=0.5)) 
  geom_pointrange(aes(ymax = UpperCI, ymin = LowerCI),position=position_dodge(width=0.5))  
  theme_bw()  
  theme(text=element_text(size=25),axis.text.x = element_text(angle = 45, hjust = 1))  
  ylab("Odds ratio")  
  xlab("Gene set size")  
 theme(plot.margin = unit(c(2,2,2,2), "cm")) 

CodePudding user response:

df %>% mutate(Method = fct_relevel(Method, 'Pairwise')) %>% <<your ggplot2 code> 

should do the job, assuming you have imported the tidyverse pipe operator %>% and the forcats package, which you can do with require(tidyverse)

CodePudding user response:

You can simply reverse the ordering of the Method factor with forcats::fct_rev.

df$Method <- fct_rev(df$Method)

Alternatively, you can specify the first level when you initially converted that column to a factor.

  • Related