0
votes

I'm tyring to facet wrap this scatter plot by the y axis.For example, if the y-axis goes up to 1000, I would like to separate this graph into 4, the first where the y-axis goes from 0-250, the next 251-500, the next 501-750, and the last 751-1000. Is this type of facet wrapping possible?

library(ggplot2)

A
nrow(A)
# 1000
ncol(A)
# 3
head(A)
#   Track Base Location
# 1     1    A        1
# 2     1    C        2
# 3     1    G        3
# 4     1    G        4
# 5     1    A        5
# 6     1    A        6

p <- ggplot(data = A, aes(y=Track, x=Location)) + 
  geom_point(aes(colour=Base),shape=15,size=2)
  print(p)

This is what I have right now, as you can see, it doesn't look aesthetically pleasing. This is what I have right now, as you can see, it doesn't look aesthetically pleasing.

1
Please provide a reproducible example - we can't recreate your code as we don't have A.mathematical.coffee

1 Answers

2
votes

You can - you just have to make an indicator variable which shows which facet each point should belong in.

(Quick aside - what you have placed in your question is still not a reproducible example - what we are after is something we can copy-paste into our terminals that will still demonstrate your problem. For example, in my answer I've shown you a reproducible example where I only have 100 rows in A rather than you 1000, and my intervals are different to yours, but the key is you can copy-paste it straight to your terminal and you can easily see how it will extend to your problem).

e.g.

# here's a reproducible example, with 100 data points
A <- data.frame(Track=1, Location=1:100, Base=factor(sample(c('A', 'T', 'C', 'G'), 100, replace=T)))

library(ggplot2)

ggplot(transform(A, panel=cut(Location, seq(0, 100, by=25), include.lowest=T)),
       aes(x=Track, y=Location)) + 
  geom_point(aes(colour=Base),shape=15,size=2) +
  facet_wrap( ~ panel, scales='free')

Key points:

  • transform(A, panel=...) adds an extra column "panel" into your dataframe (try running that on its own to see)
  • cut(Location, seq(0, 100, by=25), include.lowest=T) makes a factor that indicates which interval each Location is in. The intervals here are [0, 25], (25,50] (50,75] (75,100] (the include.lowest makes sure that the 0 is included in the first interval). For the breaks you mentioned in your question you'd do something like seq(0, 1000, by=250)
  • the facet_wrap(~ panel,...) makes one facet per interval
  • the scales='free' in the facet_wrap makes it so that all the y scales may be different in each panel (skip it out and they all get plotted on a common scale - just try to skip it out and you will see what I mean).

enter image description here