Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change axis breaks without defining sequence - ggplot

Tags:

r

ggplot2

Is there any way to set the break step size in ggplot without defining a sequence. For example:

x <- 1:10
y <- 1:10

df <- data.frame(x, y)

# Plot with auto scale
ggplot(df, aes(x,y)) + geom_point()

# Plot with breaks defined by sequence
ggplot(df, aes(x,y)) + geom_point() +
  scale_y_continuous(breaks = seq(0,10,1))

# Plot with automatic sequence for breaks
ggplot(df, aes(x,y)) + geom_point() +
  scale_y_continuous(breaks = seq(min(df$y),max(df$y),1))

# Does this exist?
ggplot(df, aes(x,y)) + geom_point() +
  scale_y_continuous(break_step = 1)

You may say I am being lazy but there have been a few occasions where I have had to change the min and max limits of my seq due to the addition of error bars. So I just want to say...use a break size of x, with automatic scale limits.

like image 962
Pete900 Avatar asked Aug 19 '16 13:08

Pete900


1 Answers

You can define your own function to pass to the breaks argument. An example that would work in your case would be

f <- function(y) seq(floor(min(y)), ceiling(max(y)))

Then

ggplot(df, aes(x,y)) + geom_point() + scale_y_continuous(breaks = f)

gives

enter image description here

You could modify this to pass the step of the breaks, e.g.

f <- function(k) {
        step <- k
        function(y) seq(floor(min(y)), ceiling(max(y)), by = step)       
}

then

ggplot(df, aes(x,y)) + geom_point() + scale_y_continuous(breaks = f(2))

would create a y-axis with ticks at 2, 4, .., 10, etc.

You can take this even further by writing your own scale function

my_scale <- function(step = 1, ...) scale_y_continuous(breaks = f(step), ...)

and just call it like

ggplot(df, aes(x,y)) + geom_point() + my_scale()
like image 55
konvas Avatar answered Oct 07 '22 20:10

konvas