shweta godbole
shweta godbole

Reputation: 23

Can I draw a horizontal line at specific number of range of values using ggplot2?

I have data (from excel) with the y-axis as ranges (also calculated in excel) and the x-axis as cell counts and I would like to draw a horizontal line at a specific value in the range, like a reference line. I tried using geom_hline(yintercept = 450) but I am sure it is quite naive and does not work that way for a number in range. I wonder if there are any better suggestions for it :)

plot.new()
library(ggplot2)
d <- read.delim("C:/Users/35389/Desktop/R.txt", sep = "\t")
head(d)

d <- cbind(row.names(d), data.frame(d), row.names=NULL)
d
g <- ggplot(d, aes(d$CTRL,d$Bin.range))+ geom_col() 
g + geom_hline(yintercept = 450)

enter image description here

Upvotes: 1

Views: 1258

Answers (2)

Allan Cameron
Allan Cameron

Reputation: 173998

We don't have your data, but the following data frame is of a similar structure:

d <- data.frame(CTRL = sample(100, 10), 
                Bin.range = paste(0:9 * 50, 0:9 * 50 + 49.9, sep = "-"))

The first thing to note is that your y axis does not have your ranges ordered correctly. You have 50-99.9 at the top of the y axis. This is because your ranges are stored as characters and ggplot will automatically arrange these alphabetically, not numerically. So you need to reorder the factor levels of your ranges:

d$Bin.range <- factor(d$Bin.range, d$Bin.range)

When you create your plot, don't use d$Bin.range, but instead just use Bin.range. ggplot knows to look for this variable in the data frame you have passed.

g <- ggplot(d, aes(CTRL, Bin.range)) + geom_col() 

If you want to draw a horizontal line, your two options are to specify the y axis label at which you want to draw the line (i.e. yintercept = "400-449.9") or, which is what I suspect you want, use a numeric value of 9.5 which will put it between the top two values:

g + geom_hline(yintercept = 9.5, linetype = 2)

enter image description here

Upvotes: 0

Edo
Edo

Reputation: 7828

First of all, have a look at my comments.

Second, this is how I suggest you to proceed: don't calculate those ranges on Excel. Let ggplot do it for you.

Say, your data is like this:

df <- data.frame(x = runif(100, 0, 500))
head(df)
#>          x
#>1 322.76123
#>2  57.46708
#>3 223.31943
#>4 498.91870
#>5 155.05416
#>6 107.27830

Then you can make a plot like this:

library(ggplot2)

ggplot(df) +
 geom_histogram(aes(x = x), 
                boundary = 0,
                binwidth = 50,
                fill = "steelblue",
                colour = "white") +
 geom_vline(xintercept = 450, colour = "red", linetype = 2, size = 1) +
 coord_flip()

enter image description here

Upvotes: 1

Related Questions