-3

I have faced a similar problem as it already has been asked here and no proper answer has been shared yet. So basically the order of y-axis should change based on the size of the dots. Unfortunately the facet_grid is not helpful and changes the original dot plot. It would be great if you could help with this.

user438383
  • 5,716
  • 8
  • 28
  • 43
Apex
  • 1,055
  • 4
  • 22
  • Does this answer your question? [Order Bars in ggplot2 bar graph](https://stackoverflow.com/questions/5208679/order-bars-in-ggplot2-bar-graph) – SamR Jul 19 '22 at 09:13
  • 1
    No data & no code gives us nothing to work with. Please include both (sample data & code attempt) including a mock-up of your expected output. – Maurits Evers Jul 19 '22 at 09:46
  • 1
    Right now the y axis contain two values per variable (A and B for each GOs). To order them like the plot you expect, you would need to have one entry per GOs. Would a solution that concatenates GOs and Condition work for you? i.e. in the y axis you would have one entry for "GO1308_A" and another for "GO1308_B". – guasi Jul 19 '22 at 09:55
  • Dear @guasi - thank you for your answer. Yes, that can help. – Apex Jul 19 '22 at 09:59
  • Dear @MauritsEvers I have the exact code as the post I share in my question. That is why I did not put my code here. – Apex Jul 19 '22 at 10:00
  • I posted an answer to the [previous question](https://stackoverflow.com/questions/69883865/change-order-y-axis-of-dotplot-in-ggplot2) since that one has the code and the graph of what you expect. Note that my answer is specific to your previous question on how to order the y axis according to the x axis, not according to size as you specify in this question. – guasi Jul 19 '22 at 10:11

1 Answers1

1

To get the y-axis in the same order as the dot size, I did the following:

  • sort the data in ascending order of Count which determines dot size
  • add a column order equal to the row number
  • user order as the y-axis but use scale_y_continuous to take the labels from the GOs column

(This uses the sample code from the question you linked to.)


library("ggplot2")
# create fake data
set.seed(1024) # keep reproducibility
go <- paste0("GO", sample(1000:2000, 5))

Count <- sample(1:20, 10)
data <- data.frame("GOs" = rep(go, 2), 
                   "Condition" = rep(c("A", "B"), each = 5),
                   "GeneRatio" = 1 / sample(10, 10), 
                   "p.adjust" = 0.05 / sample(10, 10),
                   "Count" = Count)


# sort the data by Count (Count determines dot size)
data <- data[order(data$Count),]
   
# add a row number variable `order`
data <- cbind(data,order=1:nrow(data))

# plot: dot plot
ggplot(data = data, aes(x = GeneRatio, y = order, # use `order` as the y-axis
                        color = `p.adjust`, size = Count)) + 
  geom_point() +
  scale_color_gradient(low = "red", high = "blue") +
  theme_bw() + 
  ylab("") +
  xlab("") + 
  scale_y_continuous(breaks=1:nrow(data),labels=data$GOs) + # use scale_y_continuous to use GOs for labels
  ggtitle("GO enrichment analysis")

shaun_m
  • 1,213
  • 3
  • 13