mbyvcm
mbyvcm

Reputation: 141

ggplot2: split scatter plot by categorical variable

I am trying to generate a scatter plot where the x-axis is several categories of a continuous variable. The closest thing to it would be a Manhattan plot, where the x-axis is split by chromosome (categorical), but within each category the values are continuous.

Data:

chr <- sample(x = c(1,2), replace = T, size = 1000)
bp  <- as.integer(runif(n = 1000, min = 0, max = 10000))
p   <- runif(n = 1000, min = 0, max = 1)
df <- data.frame(chr,bp,p)

Starting Point:

ggplot(df, aes(y = -log10(p), x =bp)) + geom_point(colour=chr)

enter image description here

The red and black points should be separate categories along the x-axis.

Upvotes: 0

Views: 6481

Answers (2)

ulfelder
ulfelder

Reputation: 5335

If you really want to do this in a single plot instead of facets, you could conditionally rescale your x variable and then manually adjust the labels, e.g.:

df %>%
    mutate(bp.scaled = ifelse(chr == 2, bp + 10000, bp)) %>%
    ggplot(aes(y = -log10(p), x = bp.scaled)) + geom_point(colour=chr) +
    scale_x_continuous(breaks = seq(0,20000,2500),
                       labels = c(seq(0,10000,2500), seq(2500,10000,2500)))

Result: enter image description here

Upvotes: 3

djhurio
djhurio

Reputation: 5536

I am not sure if I have understood your question. Probably you are looking for facets. See the example.

require(ggplot2)

chr <- sample(x = c(1,2), replace = T, size = 1000)
bp  <- as.integer(runif(n = 1000, min = 0, max = 10000))
p   <- runif(n = 1000, min = 0, max = 1)
df <- data.frame(chr,bp,p)

ggplot(df, aes(y = -log10(p), x = bp)) +
  geom_point(aes(colour = factor(chr))) +
  facet_wrap("chr")

enter image description here

Upvotes: 5

Related Questions