12

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.

MrFlick
  • 195,160
  • 17
  • 277
  • 295
Pete900
  • 2,016
  • 1
  • 21
  • 44

2 Answers2

21

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()
konvas
  • 14,126
  • 2
  • 40
  • 46
2
> # Does this exist?
> ggplot(df, aes(x,y)) + geom_point() +
>   scale_y_continuous(break_step = 1)

If you're looking for an off-the-shelf solution, then you can use the scales::breaks_width() function like so:

scale_y_continuous(breaks = scales::breaks_width(1))

The scales package also includes handy functions to control breaks easily in "special" scales such as date-time, e.g. scale_x_datetime(breaks='6 hours').

Robert Lew
  • 51
  • 3